🎯 Cele lekcji

3️⃣

1. Trzecia postać normalna (3NF)

3NF (Third Normal Form) — tabela spełnia 3NF gdy:
1. Spełnia 2NF
2. Żadna kolumna nie będąca kluczem nie zależy przechodnio od klucza głównego

Inaczej: kolumna nie-kluczowa nie może zależeć od innej kolumny nie-kluczowej.

Co to jest zależność przechodnia?

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.

Przykład naruszenia 3NF

id_pracownika (PK) imie id_dzialu nazwa_dzialu lokalizacja_dzialu
1Jan Kowalski10ITWarszawa
2Anna Nowak10ITWarszawa
3Piotr Wiśniewski20HRKraków
Problem: id_pracownika → id_dzialu → nazwa_dzialu (zależność przechodnia!)
nazwa_dzialu i lokalizacja_dzialu zależą od id_dzialu, nie od id_pracownika.

Po normalizacji do 3NF — rozdziel na dwie tabele:

pracownicy
  • 🔑 id_pracownika
  • imie
  • 🔗 id_dzialu (FK)
N ──── 1
dzialy
  • 🔑 id_dzialu
  • nazwa_dzialu
  • lokalizacja_dzialu
Efekt: zmiana nazwy działu wymaga teraz jednej aktualizacji w tabeli dzialy — brak anomalii aktualizacji!
🔬

2. BCNF — postać normalna Boycea-Codda

BCNF (Boyce-Codd Normal Form) — silniejsza wersja 3NF.
Dla każdej zależności funkcjonalnej X → Y, X musi być nadkluczem (superkey) tabeli.

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ćEliminujeKiedy stosować
1NFNieatomowe wartości, powtarzające się grupyZawsze — minimum
2NFCzęściowe zależności od klucza złożonegoGdy PK jest złożony
3NFZależności przechodnieStandardowe projekty
BCNFAnomalie przy wielu kluczach kandydującychZaawansowane projekty
⚖️

3. Kiedy denormalizować?

Denormalizacja to świadome wprowadzenie redundancji w celu poprawy wydajności zapytań.

Powód denormalizacjiPrzykładRyzyko
Szybkie odczyty (raportowanie)Przechowywanie sumy zamówienia w tabeliNieaktualność sumy po zmianie ceny
Zmniejszenie liczby JOIN-ówDuplikowanie nazwy kategorii w tabeli produktuAnomalia aktualizacji
Systemy OLAP / hurtownie danychTabele faktów z wieloma atrybutamiDuże zużycie miejsca
Dane historyczne (snapshot)Cena produktu w momencie zamówieniaCelowa redundancja — poprawna!
Zasada: Najpierw znormalizuj do 3NF, a następnie denormalizuj świadomie tylko tam, gdzie istnieją mierzalne problemy wydajnościowe. Nigdy nie denormalizuj z lenistwa.
✏️

Zadania interaktywne

Zadanie 1Rozpoznaj naruszenie 3NF

W tabeli faktury(id_faktury, id_klienta, imie_klienta, miasto_klienta, kwota) wskaż, które kolumny naruszają 3NF:

  • Tylko kwota — zależy od id_faktury
  • imie_klienta i miasto_klienta — zależą przechodnio przez id_klienta
  • Tylko id_klienta — jest kluczem obcym
  • Żadna kolumna nie narusza 3NF
Zadanie 2Quiz powtórkowy — Blok I (5 pytań)

P1. Który typ danych SQL przechowuje liczbę całkowitą?

  • VARCHAR
  • INT
  • DECIMAL
  • FLOAT

P2. Co to jest klucz kandydujący?

  • Klucz obcy wskazujący na inną tabelę
  • Kolumna zawierająca indeks
  • Minimalny zestaw kolumn jednoznacznie identyfikujących wiersz
  • Klucz główny złożony z wielu kolumn

P3. Która postać normalna eliminuje zależności przechodnie?

  • 1NF
  • 2NF
  • 3NF
  • BCNF

P4. Co przechowuje typ danych DATE w MySQL?

  • Datę i godzinę (YYYY-MM-DD HH:MM:SS)
  • Tylko datę (YYYY-MM-DD)
  • Tylko godzinę
  • Znacznik czasu Unix

P5. Czym różni się klucz główny (PK) od klucza obcego (FK)?

  • PK identyfikuje wiersz w swojej tabeli; FK wskazuje na PK w innej tabeli
  • PK może mieć wartość NULL; FK nie może
  • FK jest zawsze AUTO_INCREMENT; PK nie
  • Są identyczne — to dwa nazwy tego samego klucza
Zadanie 3Normalizacja — jakie tabele powstaną?

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):

📌 Zapamiętaj