Jeśli A → B i B → C, to C przechodnio zależy od A. Gdy A to klucz główny, a B i C to kolumny nie-kluczowe — naruszamy 3NF.
| id_pracownika (PK) | imie | id_dzialu | nazwa_dzialu | lokalizacja_dzialu |
|---|---|---|---|---|
| 1 | Jan Kowalski | 10 | IT | Warszawa |
| 2 | Anna Nowak | 10 | IT | Warszawa |
| 3 | Piotr Wiśniewski | 20 | HR | Kraków |
dzialy — brak anomalii aktualizacji!W praktyce BCNF różni się od 3NF tylko w przypadku tabel z wieloma nakładającymi się kluczami kandydującymi. Dla większości projektów spełnienie 3NF jest wystarczające.
| Postać | Eliminuje | Kiedy stosować |
|---|---|---|
| 1NF | Nieatomowe wartości, powtarzające się grupy | Zawsze — minimum |
| 2NF | Częściowe zależności od klucza złożonego | Gdy PK jest złożony |
| 3NF | Zależności przechodnie | Standardowe projekty |
| BCNF | Anomalie przy wielu kluczach kandydujących | Zaawansowane projekty |
Denormalizacja to świadome wprowadzenie redundancji w celu poprawy wydajności zapytań.
| Powód denormalizacji | Przykład | Ryzyko |
|---|---|---|
| Szybkie odczyty (raportowanie) | Przechowywanie sumy zamówienia w tabeli | Nieaktualność sumy po zmianie ceny |
| Zmniejszenie liczby JOIN-ów | Duplikowanie nazwy kategorii w tabeli produktu | Anomalia aktualizacji |
| Systemy OLAP / hurtownie danych | Tabele faktów z wieloma atrybutami | Duże zużycie miejsca |
| Dane historyczne (snapshot) | Cena produktu w momencie zamówienia | Celowa redundancja — poprawna! |
W tabeli faktury(id_faktury, id_klienta, imie_klienta, miasto_klienta, kwota) wskaż, które kolumny naruszają 3NF:
P1. Który typ danych SQL przechowuje liczbę całkowitą?
P2. Co to jest klucz kandydujący?
P3. Która postać normalna eliminuje zależności przechodnie?
P4. Co przechowuje typ danych DATE w MySQL?
P5. Czym różni się klucz główny (PK) od klucza obcego (FK)?
Masz tabelę: wypozyczenia(id_wyp, id_czytelnika, imie_czyt, email_czyt, id_ksiazki, tytul_ksiazki, autor_ksiazki, data_wyp, data_zwrotu)
Przeprowadź normalizację do 3NF. Ile osobnych tabel powstanie? Wpisz liczbę:
Wpisz nazwy tabel (oddzielone przecinkami):