🎯 Cele lekcji

⚠️

1. Po co normalizować? Anomalie danych

Normalizacja to proces organizowania tabel w bazie danych w celu zmniejszenia redundancji (nadmiarowości) i poprawy integralności danych. Bez normalizacji baza danych jest podatna na anomalie.

Typ anomaliiOpisPrzykład
Anomalia wstawiania Nie można wstawić pewnych danych bez wstawienia innych, niepowiązanych Nie można dodać nowego działu dopóki nie ma w nim żadnego pracownika
Anomalia usuwania Usunięcie jednych danych powoduje niezamierzoną utratę innych Usunięcie ostatniego pracownika działu powoduje utratę informacji o dziale
Anomalia aktualizacji Zmiana wartości wymaga aktualizacji wielu wierszy (duplikaty) Zmiana nazwy działu wymaga edycji każdego pracownika z tego działu
Anomalie są skutkiem redundancji danych — przechowywania tych samych informacji w wielu miejscach jednocześnie.
1️⃣

2. Pierwsza postać normalna (1NF)

1NF (First Normal Form) — tabela spełnia 1NF gdy:
1. Każda komórka zawiera tylko jedną, atomową (niepodzielną) wartość
2. Każdy wiersz jest unikalny (istnieje klucz główny)
3. Brak powtarzających się grup kolumn (np. telefon1, telefon2, telefon3)

Przykład naruszenia 1NF

Tabela zamowienia_nieznormalizowana — kolumna produkty zawiera listę:

idklientprodukty
1Jan KowalskiLaptop, Mysz, Klawiatura
2Anna NowakMonitor, Kabel HDMI
3Piotr WiśniewskiLaptop
Problem: kolumna produkty zawiera wiele wartości w jednej komórce — naruszenie atomowości.

Po normalizacji do 1NF — rozbij na wiersze:

id_zamowieniaklientprodukt
1Jan KowalskiLaptop
1Jan KowalskiMysz
1Jan KowalskiKlawiatura
2Anna NowakMonitor
2Anna NowakKabel HDMI
3Piotr WiśniewskiLaptop
Klucz główny to teraz kombinacja (id_zamowienia, produkt) lub lepiej: dodaj osobną kolumnę id_pozycji.

Drugi typ naruszenia: powtarzające się grupy kolumn

id_klientaimietelefon1telefon2telefon3
1Jan500111222600333444NULL
2Anna700555666NULLNULL
Rozwiązanie: utwórz osobną tabelę telefony_klientow(id_klienta FK, numer_telefonu).
2️⃣

3. Druga postać normalna (2NF)

2NF (Second Normal Form) — tabela spełnia 2NF gdy:
1. Spełnia 1NF
2. Każda kolumna nie będąca kluczem jest w pełni zależna od całego klucza głównego (brak częściowych zależności)

2NF dotyczy tylko tabel ze złożonym kluczem głównym!

Przykład naruszenia 2NF

Tabela pozycje_zamowien z złożonym kluczem głównym (id_zamowienia, id_produktu):

id_zamowienia (PK) id_produktu (PK) ilosc nazwa_produktu cena_katalogowa
1102Laptop2999.00
1201Mysz49.00
2101Laptop2999.00
Problem: kolumny nazwa_produktu i cena_katalogowa zależą tylko od id_produktu, nie od całego klucza (id_zamowienia, id_produktu) — to częściowa zależność.

Po normalizacji do 2NF — rozdziel na dwie tabele:

pozycje_zamowien
  • 🔑 id_zamowienia (PK, FK)
  • 🔑 id_produktu (PK, FK)
  • ilosc
N ──── 1
produkty
  • 🔑 id_produktu (PK)
  • nazwa_produktu
  • cena_katalogowa
Reguła: Jeśli tabela ma klucz prosty (jednokolumnowy), to 1NF automatycznie zapewnia 2NF — bo nie ma „częściowości" klucza.
✏️

Zadania interaktywne

Zadanie 1Czy tabela spełnia 1NF?

Poniższa tabela klienci zawiera kolumnę numery_telefonow. Czy spełnia 1NF?

id_klientaimienumery_telefonow
1Jan500-111-222; 600-333-444
2Anna700-555-666
  • Tak, spełnia 1NF — każda komórka ma wartość
  • Nie, narusza 1NF — kolumna numery_telefonow zawiera wiele wartości oddzielonych średnikiem
  • Nie, narusza 1NF — brakuje klucza głównego
  • Tak, spełnia 1NF — jest tylko jeden rekord z wieloma telefonami
Zadanie 2Dopasuj anomalie do opisów

Dopasuj typ anomalii do opisanej sytuacji:

Chcesz dodać nowy dział „Marketing", ale system wymaga podania pracownika w tym dziale
Zmieniasz numer telefonu dostawcy — musisz zaktualizować go w 50 wierszach
Usuwasz jedynego pracownika działu IT — tracisz wszelkie dane o tym dziale
Zadanie 3Uzupełnij — normalizacja do 1NF

Tabela zamowienia (poniżej) narusza 1NF. Po normalizacji do 1NF każdy produkt ma osobny wiersz. Jak powinna nazywać się nowa tabela pośrednia przechowująca pozycje zamówień?

Tabela zawiera kolumny: id_zamowienia, data, klient, lista_produktow (lista oddzielona przecinkami).

Wpisz brakującą nazwę kolumny klucza obcego w nowej tabeli pośredniej:

pozycje_zamowien (
  id_pozycji    INT AUTO_INCREMENT PRIMARY KEY,
   INT NOT NULL, -- FK do zamowienia
  nazwa_produktu  VARCHAR(200) NOT NULL
)

📌 Zapamiętaj