Zdefiniować i zastosować pierwszą postać normalną (1NF)
Zdefiniować i zastosować drugą postać normalną (2NF)
Rozpoznać naruszenia 1NF i 2NF w przykładowych tabelach
⚠️
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 anomalii
Opis
Przykł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ę:
id
klient
produkty
1
Jan Kowalski
Laptop, Mysz, Klawiatura
2
Anna Nowak
Monitor, Kabel HDMI
3
Piotr Wiśniewski
Laptop
Problem: kolumna produkty zawiera wiele wartości w jednej komórce — naruszenie atomowości.
Po normalizacji do 1NF — rozbij na wiersze:
id_zamowienia
klient
produkt
1
Jan Kowalski
Laptop
1
Jan Kowalski
Mysz
1
Jan Kowalski
Klawiatura
2
Anna Nowak
Monitor
2
Anna Nowak
Kabel HDMI
3
Piotr Wiśniewski
Laptop
Klucz główny to teraz kombinacja (id_zamowienia, produkt) lub lepiej: dodaj osobną kolumnę id_pozycji.
Drugi typ naruszenia: powtarzające się grupy kolumn
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
1
10
2
Laptop
2999.00
1
20
1
Mysz
49.00
2
10
1
Laptop
2999.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_klienta
imie
numery_telefonow
1
Jan
500-111-222; 600-333-444
2
Anna
700-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
Anomalie: wstawiania, usuwania, aktualizacji — wynikają z redundancji danych
1NF: atomowość wartości + unikalność wierszy + brak powtarzających się grup kolumn
2NF: 1NF + brak częściowych zależności (dotyczy tabel ze złożonym kluczem PK)
Kolumna zależy częściowo od klucza → przenieś ją do osobnej tabeli