praca_magisterska/pytania/odpowiedzi/03-redundancja-normalizacja.md

516 lines
14 KiB
Markdown
Raw Normal View History

2025-12-21 19:58:11 +01:00
# Pytanie 3: Redundancja i normalizacja w relacyjnej bazie danych
## Pytanie
**"Omówić zagadnienia redundancji i normalizacji w relacyjnej bazie danych oraz wynikające z tego wymagania."**
Przedmiot: BD2 (Bazy Danych 2)
---
## 📚 Odpowiedź główna
### Wprowadzenie
**Redundancja** (nadmiarowość) i **normalizacja** to dwa fundamentalne, przeciwstawne pojęcia w projektowaniu relacyjnych baz danych:
- **Redundancja** = niepożądane powtarzanie danych
- **Normalizacja** = proces eliminacji redundancji poprzez dekompozycję relacji
---
## 1. Redundancja danych
### Definicja
**Redundancja** występuje, gdy ta sama informacja jest przechowywana w wielu miejscach bazy danych, co prowadzi do:
- Marnowania pamięci
- Niespójności danych (anomalii)
- Trudności w utrzymaniu
### Anomalie wynikające z redundancji
#### Przykład - tabela z redundancją:
| StudentID | Imię | Nazwisko | KursID | NazwaKursu | Prowadzący |
|-----------|------|----------|--------|------------|------------|
| 1 | Jan | Kowalski | BD1 | Bazy Danych | Dr Nowak |
| 1 | Jan | Kowalski | AISDI | Algorytmy | Prof. Wiśniewski |
| 2 | Anna | Nowak | BD1 | Bazy Danych | Dr Nowak |
| 2 | Anna | Nowak | BD1 | Bazy Danych | Dr Nowak |
**Problemy:**
- "Bazy Danych" i "Dr Nowak" powtórzono 3 razy
- "Jan Kowalski" powtórzono 2 razy
### Trzy typy anomalii
#### 1. Anomalia wstawiania (Insertion Anomaly)
**Problem:** Nie można dodać danych bez dodania innych, niepotrzebnych danych.
**Przykład:** Nie możemy dodać nowego kursu "Sieci komputerowe" bez przypisania do niego studenta.
#### 2. Anomalia usuwania (Deletion Anomaly)
**Problem:** Usunięcie danych powoduje niezamierzoną utratę innych informacji.
**Przykład:** Jeśli Anna Nowak zrezygnuje ze studiów, tracimy informację, że kurs BD1 prowadzi Dr Nowak (jeśli była jedynym studentem tego kursu).
#### 3. Anomalia modyfikacji (Update Anomaly)
**Problem:** Zmiana jednej informacji wymaga modyfikacji wielu wierszy.
**Przykład:** Jeśli Dr Nowak zmieni nazwisko, musimy zaktualizować wszystkie wiersze z kursem BD1.
---
## 2. Normalizacja
### Definicja
**Normalizacja** to proces organizowania danych w bazie w celu:
- Eliminacji redundancji
- Zapewnienia integralności danych
- Ułatwienia utrzymania i modyfikacji
### Podstawowe pojęcia
#### Zależność funkcyjna (Functional Dependency - FD)
**X → Y** oznacza: wartość X jednoznacznie określa wartość Y
**Przykład:** StudentID → (Imię, Nazwisko)
- Znając StudentID, możemy jednoznacznie określić imię i nazwisko
#### Klucz główny (Primary Key)
Minimalny zbiór atrybutów, który jednoznacznie identyfikuje krotkę (wiersz).
#### Klucz kandydujący (Candidate Key)
Każdy minimalny zbiór atrybutów, który mógłby być kluczem głównym.
#### Atrybut pierwszy (Prime Attribute)
Atrybut należący do jakiegokolwiek klucza kandydującego.
#### Atrybut wtórny (Non-prime Attribute)
Atrybut nienależący do żadnego klucza kandydującego.
---
## 3. Postacie normalne
### Hierarchia postaci normalnych
```
5NF ⊂ 4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF
```
Każda wyższa postać implikuje niższą.
---
### 1NF - Pierwsza Postać Normalna
#### Wymagania:
1. **Atomowość wartości** - każda komórka zawiera jedną, niepodzielną wartość
2. **Brak powtarzających się grup** - brak tablic/list w komórkach
3. **Istnieje klucz główny**
#### ❌ Naruszenie 1NF:
| StudentID | Imię | Telefony |
|-----------|------|----------|
| 1 | Jan | 123456, 789012 |
#### ✅ Po normalizacji do 1NF:
**Studenci:**
| StudentID | Imię |
|-----------|------|
| 1 | Jan |
**Telefony:**
| StudentID | Telefon |
|-----------|---------|
| 1 | 123456 |
| 1 | 789012 |
---
### 2NF - Druga Postać Normalna
#### Wymagania:
1. Spełnia 1NF
2. **Każdy atrybut wtórny jest w pełni funkcyjnie zależny od całego klucza głównego** (nie od jego części)
Dotyczy tylko tabel z **kluczem złożonym** (wielokolumnowym).
#### ❌ Naruszenie 2NF:
| StudentID | KursID | NazwaKursu | Ocena |
|-----------|--------|------------|-------|
| 1 | BD1 | Bazy Danych | 5 |
| 2 | BD1 | Bazy Danych | 4 |
Klucz: (StudentID, KursID)
- NazwaKursu zależy tylko od KursID, nie od całego klucza!
- KursID → NazwaKursu (częściowa zależność)
#### ✅ Po normalizacji do 2NF:
**Oceny:**
| StudentID | KursID | Ocena |
|-----------|--------|-------|
| 1 | BD1 | 5 |
| 2 | BD1 | 4 |
**Kursy:**
| KursID | NazwaKursu |
|--------|------------|
| BD1 | Bazy Danych |
---
### 3NF - Trzecia Postać Normalna
#### Wymagania:
1. Spełnia 2NF
2. **Brak przechodnich zależności funkcyjnych** - atrybuty wtórne nie zależą od innych atrybutów wtórnych
**Formalnie:** Dla każdej nietrywialnej FD X → A:
- X jest nadkluczem, LUB
- A jest atrybutem pierwszym (należy do klucza)
#### ❌ Naruszenie 3NF:
| StudentID | Imię | WydziałID | NazwaWydziału |
|-----------|------|-----------|---------------|
| 1 | Jan | W4 | Elektroniki |
Klucz: StudentID
- StudentID → WydziałID → NazwaWydziału (przechodnia zależność!)
#### ✅ Po normalizacji do 3NF:
**Studenci:**
| StudentID | Imię | WydziałID |
|-----------|------|-----------|
| 1 | Jan | W4 |
**Wydziały:**
| WydziałID | NazwaWydziału |
|-----------|---------------|
| W4 | Elektroniki |
---
### BCNF - Postać Normalna Boyce'a-Codda
#### Wymagania:
1. Spełnia 3NF
2. **Dla każdej nietrywialnej FD X → Y, X jest nadkluczem**
BCNF jest silniejsza niż 3NF - eliminuje przypadki, gdy atrybut pierwszy zależy od atrybutu niebędącego nadkluczem.
#### ❌ Naruszenie BCNF (ale spełnia 3NF):
| Student | Przedmiot | Prowadzący |
|---------|-----------|------------|
| Jan | Bazy Danych | Dr Nowak |
| Jan | Algorytmy | Dr Nowak |
| Anna | Bazy Danych | Dr Kowalski |
Klucze kandydujące: {Student, Przedmiot}, {Student, Prowadzący}
- Prowadzący → Przedmiot (jeden prowadzący = jeden przedmiot)
- Ale Prowadzący nie jest nadkluczem!
#### ✅ Po normalizacji do BCNF:
**Zapisy:**
| Student | Prowadzący |
|---------|------------|
| Jan | Dr Nowak |
| Anna | Dr Kowalski |
**Prowadzący:**
| Prowadzący | Przedmiot |
|------------|-----------|
| Dr Nowak | Bazy Danych |
| Dr Kowalski | Bazy Danych |
---
### 4NF - Czwarta Postać Normalna
#### Wymagania:
1. Spełnia BCNF
2. **Brak nietrywialnych zależności wielowartościowych** (MVD - Multivalued Dependencies)
**Zależność wielowartościowa X ↠ Y:** Dla danego X istnieje zbiór wartości Y niezależny od innych atrybutów.
#### ❌ Naruszenie 4NF:
| Pracownik | Umiejętność | Język |
|-----------|-------------|-------|
| Jan | Java | Angielski |
| Jan | Java | Niemiecki |
| Jan | Python | Angielski |
| Jan | Python | Niemiecki |
Pracownik ↠ Umiejętność i Pracownik ↠ Język (niezależne!)
#### ✅ Po normalizacji do 4NF:
**PracownikUmiejętności:**
| Pracownik | Umiejętność |
|-----------|-------------|
| Jan | Java |
| Jan | Python |
**PracownikJęzyki:**
| Pracownik | Język |
|-----------|-------|
| Jan | Angielski |
| Jan | Niemiecki |
---
### 5NF - Piąta Postać Normalna (PJNF)
#### Wymagania:
1. Spełnia 4NF
2. **Brak zależności połączeniowych** (Join Dependencies)
3. Dekompozycja bez strat tylko na podstawie kluczy kandydujących
5NF eliminuje redundancję wynikającą z niemożliwości odtworzenia oryginalnej relacji przez złączenie jej projekcji.
---
## 📊 Tabela porównawcza postaci normalnych
| Postać | Eliminuje | Wymaga |
|--------|-----------|--------|
| **1NF** | Wielowartościowe atrybuty | Atomowość, klucz główny |
| **2NF** | Częściowe zależności | Pełna zależność od klucza |
| **3NF** | Przechodnie zależności | Brak X → A gdzie X nie jest nadkluczem i A nie jest pierwszym |
| **BCNF** | Zależności od nie-nadkluczy | Każdy determinant jest nadkluczem |
| **4NF** | Wielowartościowe zależności | Brak nietrywialnych MVD |
| **5NF** | Zależności połączeniowe | Dekompozycja tylko przez klucze |
---
## 4. Proces normalizacji
### Algorytm dekompozycji do 3NF
1. **Znajdź pokrycie kanoniczne** zbioru zależności funkcyjnych
2. **Dla każdej FD X → A** utwórz relację R(X, A)
3. **Jeśli żadna relacja nie zawiera klucza kandydującego**, dodaj relację z atrybutami klucza
4. **Usuń relacje zawarte w innych relacjach**
### Własności dobrej dekompozycji
#### 1. Bezstratność (Lossless Join)
Po dekompozycji można odtworzyć oryginalną relację przez złączenie naturalne.
**Twierdzenie:** Dekompozycja R na R₁ i R₂ jest bezstratna wtw gdy:
- R₁ ∩ R₂ → R₁, lub
- R₁ ∩ R₂ → R₂
#### 2. Zachowanie zależności (Dependency Preservation)
Wszystkie oryginalne FD można zweryfikować w pojedynczych tabelach wynikowych (bez złączeń).
---
## 5. Denormalizacja
### Kiedy stosować?
- **Optymalizacja wydajności** - złączenia są kosztowne
- **Systemy OLAP/hurtownie danych** - dane głównie odczytywane
- **Raportowanie** - predefiniowane zapytania
### Techniki denormalizacji:
1. **Dodanie redundantnych kolumn** - unikanie złączeń
2. **Tabele podsumowujące** - agregaty
3. **Tabele historyczne** - snapshoty
4. **Materializowane widoki** - cache wyników
### Kompromis:
```
NORMALIZACJA ←————————————→ DENORMALIZACJA
Integralność Wydajność odczytu
Mniej redundancji Więcej redundancji
Wolniejsze odczyty Szybsze odczyty
Szybsze zapisy Wolniejsze zapisy
```
---
## 🧠 Mnemoniki
### "1-2-3-BC" dla postaci normalnych:
- **1**NF = **1** wartość w komórce (atomowość)
- **2**NF = **2** słowa: "pełna zależność" (od całego klucza)
- **3**NF = **3** słowa: "brak przechodniości" (A→B→C eliminowane)
- **BC**NF = **B**ardzo **C**isty (każdy determinant = nadklucz)
### "AIU" dla anomalii:
- **A**nomalia wstawiania (**A**dding) - nie można dodać
- **I**nsercja usuwania (**I**nterrupts) - traci dane przy DELETE
- **U**pdate modyfikacji - trzeba zmieniać wiele wierszy
### "KAP" dla kluczy:
- **K**lucz główny - wybrany unikalny identyfikator
- **A**lternatywny (kandydujący) - mógłby być głównym
- **P**ierwszy atrybut - należy do jakiegoś klucza
### Wzór na 3NF:
> "Każdy atrybut zależy od **klucza**, **całego klucza** i **tylko od klucza**."
> (The key, the whole key, and nothing but the key - so help me Codd!)
---
## ❓ Możliwe pytania dodatkowe (follow-up)
### Q1: "Podaj przykład dekompozycji do 3NF z zachowaniem bezstratności"
**Odpowiedź:**
**Relacja:** R(A, B, C, D)
**FD:** A → B, B → C, C → D
**Klucz:** A
**Dekompozycja:**
1. R₁(A, B) - z FD A → B
2. R₂(B, C) - z FD B → C
3. R₃(C, D) - z FD C → D
**Sprawdzenie bezstratności:**
- R₁ ∩ R₂ = {B}, B → C (B jest kluczem R₂) ✓
- R₂ ∩ R₃ = {C}, C → D (C jest kluczem R₃) ✓
---
### Q2: "Czym się różni 3NF od BCNF?"
**Odpowiedź:**
| Cecha | 3NF | BCNF |
|-------|-----|------|
| **Warunek** | X nadklucz LUB A pierwszy | X zawsze nadklucz |
| **Siła** | Słabsza | Silniejsza |
| **Dekompozycja** | Zachowuje zależności | Może nie zachować |
| **Redundancja** | Możliwa minimalna | Brak |
**Przykład różnicy:**
R(Student, Przedmiot, Prowadzący)
- Klucze: {Student, Przedmiot}, {Student, Prowadzący}
- FD: Prowadzący → Przedmiot
**3NF:** ✅ spełniona (Przedmiot jest atrybutem pierwszym)
**BCNF:** ❌ naruszona (Prowadzący nie jest nadkluczem)
---
### Q3: "Jak sprawdzić, czy relacja jest w 3NF?"
**Odpowiedź:**
**Algorytm:**
1. Znajdź wszystkie nietrywialne FD
2. Dla każdej FD X → A sprawdź:
- Czy X jest nadkluczem? → OK
- Czy A jest atrybutem pierwszym? → OK
- Jeśli żadne → NIE jest w 3NF
**Przykład:**
R(A, B, C), FD: {A → B, B → C}
Klucz: A
- A → B: A jest nadkluczem ✓
- B → C: B nie jest nadkluczem, C nie jest pierwszy ✗
**Wniosek:** R NIE jest w 3NF
---
### Q4: "Kiedy normalizacja może zaszkodzić?"
**Odpowiedź:**
1. **Systemy OLAP/raportowe:**
- Złączenia wielu tabel są kosztowne
- Dane głównie odczytywane, rzadko modyfikowane
- Lepiej: denormalizacja, schematy gwiazdy/płatka śniegu
2. **Aplikacje o wysokiej wydajności:**
- Każde złączenie to koszt
- Cache'owanie i replikacja danych może być szybsze
3. **Systemy czasu rzeczywistego:**
- Determinizm ważniejszy niż oszczędność miejsca
- Redundancja może przyspieszyć dostęp
**Zasada:** Normalizuj dla OLTP, denormalizuj dla OLAP
---
### Q5: "Co to jest zależność wielowartościowa (MVD)?"
**Odpowiedź:**
**Zależność wielowartościowa X ↠ Y:**
Dla każdej wartości X istnieje zbiór wartości Y, który jest niezależny od innych atrybutów relacji.
**Formalnie:** X ↠ Y w R(X, Y, Z) gdy:
Dla każdych dwóch krotek t₁, t₂ takich że t₁[X] = t₂[X]:
istnieje krotka t₃ gdzie:
- t₃[X] = t₁[X] = t₂[X]
- t₃[Y] = t₁[Y]
- t₃[Z] = t₂[Z]
**Intuicja:** Y i Z są "niezależne" przy danym X.
**Przykład:**
Pracownik ↠ Umiejętność (niezależne od języka)
Pracownik ↠ Język (niezależne od umiejętności)
---
### Q6: "Wyjaśnij pojęcie pokrycia kanonicznego"
**Odpowiedź:**
**Pokrycie kanoniczne** to minimalny zbiór FD równoważny oryginalnemu.
**Właściwości:**
1. Prawa strona każdej FD ma jeden atrybut
2. Lewa strona jest minimalna (brak nadmiarowych atrybutów)
3. Brak redundantnych FD
**Algorytm:**
1. Rozłóż prawe strony: A → BC na A → B, A → C
2. Usuń nadmiarowe atrybuty z lewych stron
3. Usuń redundantne FD (te wynikające z innych)
**Przykład:**
F = {A → BC, B → C, A → B, AB → C}
Pokrycie kanoniczne:
Fc = {A → B, B → C}
---
## 🎯 Kluczowe punkty do zapamiętania
1. **Redundancja** = powtarzanie danych → anomalie AIU
2. **Normalizacja** = dekompozycja eliminująca redundancję
3. **3NF** = standard praktyczny (zachowuje zależności)
4. **BCNF** = silniejsza, ale może gubić zależności
5. **Wzór 3NF:** "klucz, cały klucz, tylko klucz"
6. **Kompromis:** normalizacja vs wydajność
---
## 📖 Źródła do pogłębienia
1. Date, C.J. - "An Introduction to Database Systems"
2. Elmasri, Navathe - "Fundamentals of Database Systems"
3. Codd, E.F. - "A Relational Model of Data for Large Shared Data Banks" (1970)
4. Garcia-Molina, Ullman, Widom - "Database Systems: The Complete Book"