14 KiB
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:
- Atomowość wartości - każda komórka zawiera jedną, niepodzielną wartość
- Brak powtarzających się grup - brak tablic/list w komórkach
- 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:
- Spełnia 1NF
- 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:
- Spełnia 2NF
- 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:
- Spełnia 3NF
- 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:
- Spełnia BCNF
- 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:
- Spełnia 4NF
- Brak zależności połączeniowych (Join Dependencies)
- 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
- Znajdź pokrycie kanoniczne zbioru zależności funkcyjnych
- Dla każdej FD X → A utwórz relację R(X, A)
- Jeśli żadna relacja nie zawiera klucza kandydującego, dodaj relację z atrybutami klucza
- 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:
- Dodanie redundantnych kolumn - unikanie złączeń
- Tabele podsumowujące - agregaty
- Tabele historyczne - snapshoty
- 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:
- 1NF = 1 wartość w komórce (atomowość)
- 2NF = 2 słowa: "pełna zależność" (od całego klucza)
- 3NF = 3 słowa: "brak przechodniości" (A→B→C eliminowane)
- BCNF = Bardzo Cisty (każdy determinant = nadklucz)
"AIU" dla anomalii:
- Anomalia wstawiania (Adding) - nie można dodać
- Insercja usuwania (Interrupts) - traci dane przy DELETE
- Update modyfikacji - trzeba zmieniać wiele wierszy
"KAP" dla kluczy:
- Klucz główny - wybrany unikalny identyfikator
- Alternatywny (kandydujący) - mógłby być głównym
- Pierwszy 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:
- R₁(A, B) - z FD A → B
- R₂(B, C) - z FD B → C
- 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:
- Znajdź wszystkie nietrywialne FD
- 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ź:
-
Systemy OLAP/raportowe:
- Złączenia wielu tabel są kosztowne
- Dane głównie odczytywane, rzadko modyfikowane
- Lepiej: denormalizacja, schematy gwiazdy/płatka śniegu
-
Aplikacje o wysokiej wydajności:
- Każde złączenie to koszt
- Cache'owanie i replikacja danych może być szybsze
-
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:
- Prawa strona każdej FD ma jeden atrybut
- Lewa strona jest minimalna (brak nadmiarowych atrybutów)
- Brak redundantnych FD
Algorytm:
- Rozłóż prawe strony: A → BC na A → B, A → C
- Usuń nadmiarowe atrybuty z lewych stron
- 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
- Redundancja = powtarzanie danych → anomalie AIU
- Normalizacja = dekompozycja eliminująca redundancję
- 3NF = standard praktyczny (zachowuje zależności)
- BCNF = silniejsza, ale może gubić zależności
- Wzór 3NF: "klucz, cały klucz, tylko klucz"
- Kompromis: normalizacja vs wydajność
📖 Źródła do pogłębienia
- Date, C.J. - "An Introduction to Database Systems"
- Elmasri, Navathe - "Fundamentals of Database Systems"
- Codd, E.F. - "A Relational Model of Data for Large Shared Data Banks" (1970)
- Garcia-Molina, Ullman, Widom - "Database Systems: The Complete Book"