Normalizacja baz danych: 1NF, 2NF i 3NF na jednym przykładzie
Normalizacja baz danych to sposób projektowania tabel tak, żeby ta sama informacja nie powtarzała się w wielu miejscach. Dzięki temu zmiana adresu klienta wymaga poprawy jednego wiersza, a nie stu, a dane nie rozjeżdżają się między tabelami. Poniżej przechodzimy przez trzy pierwsze postacie normalne, 1NF, 2NF i 3NF, na jednym przykładzie tabeli zamówień, bo to najszybszy sposób, żeby zrozumieć, o co w tym chodzi przed sprawdzianem albo egzaminem.
Po co jest normalizacja baz danych
Wyobraź sobie mały sklep internetowy, który od początku trzyma wszystkie swoje dane w jednej tabeli. Dane klienta i produktu powtarzają się w każdym zamówieniu. Rodzi to trzy typowe problemy, nazywane anomaliami:
- Anomalia modyfikacji. Klient zmienia adres, a ty musisz poprawić go we wszystkich jego zamówieniach. Jeśli pominiesz jeden wiersz, baza ma dwie sprzeczne wersje.
- Anomalia wstawiania. Nie dodasz nowego produktu, dopóki ktoś go nie zamówi, bo tabela opisuje tylko zamówienia.
- Anomalia usuwania. Usuwasz jedyne zamówienie klienta i tracisz przy okazji jego dane.
Normalizacja usuwa te problemy, dzieląc dane na mniejsze, powiązane tabele. Działa to w relacyjnych bazach danych, gdzie tabele łączy się kluczami.
Przykład: tabela przed normalizacją
Punkt wyjścia to tabela zamówień, w której wszystko jest razem. W kolumnie z produktami są dwie wartości w jednej komórce.
| id_zam | klient | miasto | kod_miasta | produkty | data |
|---|---|---|---|---|---|
| 1 | Anna Nowak | Kraków | 30-001 | Mysz 50 zł, Klawiatura 120 zł | 05.11 |
| 2 | Jan Kowal | Gdańsk | 80-001 | Mysz 50 zł | 06.11 |
| 3 | Anna Nowak | Kraków | 30-001 | Monitor 700 zł | 07.11 |
Pierwsza postać normalna (1NF): jedna wartość w komórce
Tabela jest w 1NF, gdy każda komórka zawiera jedną, niepodzielną wartość, nie ma powtarzających się grup kolumn, a każdy wiersz da się jednoznacznie zidentyfikować kluczem głównym.
U nas problemem jest kolumna z produktami. Rozbijamy ją tak, żeby każdy produkt miał własny wiersz, a nazwę i cenę w osobnych kolumnach. Klucz główny składa się teraz z dwóch pól: id_zam i produkt.
| id_zam | produkt | cena | klient | miasto | kod_miasta | data |
|---|---|---|---|---|---|---|
| 1 | Mysz | 50 | Anna Nowak | Kraków | 30-001 | 05.11 |
| 1 | Klawiatura | 120 | Anna Nowak | Kraków | 30-001 | 05.11 |
| 2 | Mysz | 50 | Jan Kowal | Gdańsk | 80-001 | 06.11 |
| 3 | Monitor | 700 | Anna Nowak | Kraków | 30-001 | 07.11 |
Druga postać normalna (2NF): wszystko zależy od całego klucza
Tabela jest w 2NF, gdy jest w 1NF, a każda kolumna niebędąca kluczem zależy od całego klucza głównego, a nie tylko od jego części.
Sprawdzamy to przy kluczu id_zam i produkt. Cena zależy od samego produktu, a klient, miasto i data od samego zamówienia. To zależności częściowe, więc wynosimy je do osobnych tabel:
- Zamowienia: id_zam, klient, miasto, kod_miasta, data
- Produkty: produkt, cena
- Pozycje_zamowienia: id_zam, produkt
Teraz cena myszy jest zapisana raz. Jej zmiana wymaga poprawy jednego wiersza w tabeli Produkty. W praktyce przy realnym sklepie cenę z dnia zakupu zapisuje się też w pozycji zamówienia, bo cena w katalogu zmienia się z czasem, ale to już świadoma decyzja projektowa.
Trzecia postać normalna (3NF): bez zależności przechodnich
Tabela jest w 3NF, gdy jest w 2NF, a kolumny niebędące kluczem nie zależą od innych kolumn niebędących kluczem. Taka zależność nazywa się przechodnią.
W tabeli Zamowienia id_zam wyznacza klienta, a klient wyznacza miasto. Miasto zależy więc od zamówienia tylko pośrednio. Wydzielamy klientów, a w naszym uproszczeniu także miasta:
- Klienci: id_klienta, klient, kod_miasta
- Miasta: kod_miasta, miasto
- Zamowienia: id_zam, id_klienta, data
- Produkty: id_produktu, nazwa, cena
- Pozycje_zamowienia: id_zam, id_produktu
Zmiana adresu klienta to teraz jeden wiersz. Tabele łączy się w zapytaniach kluczami, a jak to działa, wyjaśniamy w tekście o kluczu głównym i obcym. W zadaniach szkolnych zwykle wystarcza dojście do 3NF. Istnieją wyższe postacie, jak postać Boyce’a-Codda, ale rzadko są potrzebne na tym poziomie.
Skrócona ściąga i denormalizacja
| Postać | Warunek | Co robisz |
|---|---|---|
| 1NF | jedna wartość w komórce, jest klucz główny | rozbijasz listy na wiersze |
| 2NF | brak zależności od części klucza | wydzielasz to, co zależy od części klucza |
| 3NF | brak zależności między kolumnami niekluczowymi | wydzielasz dane opisujące inną rzecz |
Normalizacja ma też koszt. Dane są rozproszone, więc zapytania wymagają wielu złączeń, a przy dużych systemach analitycznych może to spowalniać odczyt. Dlatego czasem stosuje się denormalizację, czyli świadome powtórzenie części danych dla szybkości, na przykład zapisanie sumy zamówienia w tabeli zamówień. Ważne, żeby było to świadome, a nie przypadkowe.
Normalizacja baz danych: zadanie do samodzielnego rozwiązania
Biblioteka trzyma wszystko w jednej tabeli z kolumnami: id_wypozyczenia, czytelnik, telefon, ksiazki (na przykład „Lalka, Dziady”), autorzy i data. Spróbuj doprowadzić ją do 3NF, zanim przeczytasz rozwiązanie.
- 1NF. Kolumny ksiazki i autorzy mają po kilka wartości w jednej komórce. Każda książka dostaje własny wiersz, a klucz główny tworzą id_wypozyczenia i tytul.
- 2NF. Autor zależy od samego tytułu, a czytelnik, telefon i data od samego wypożyczenia. To zależności od części klucza, więc wydzielamy książki i wypożyczenia.
- 3NF. Telefon zależy od czytelnika, a nie od wypożyczenia. Wydzielamy czytelników.
Wynik to cztery tabele:
- Czytelnicy: id_czytelnika, czytelnik, telefon
- Ksiazki: id_ksiazki, tytul, autor
- Wypozyczenia: id_wypozyczenia, id_czytelnika, data
- Pozycje_wypozyczenia: id_wypozyczenia, id_ksiazki
Na sprawdzianie pomagają trzy pytania, zadawane po kolei. Czy w którejś komórce jest lista? To problem 1NF. Czy przy kluczu złożonym jakaś kolumna zależy tylko od jego części? To problem 2NF. Czy któraś kolumna opisuje coś innego niż klucz tabeli? To problem 3NF. Jeśli na wszystkie odpowiadasz „nie”, tabela jest w trzeciej postaci normalnej. Przed oddaniem pracy sprawdź jeszcze, czy po podziale każda tabela ma klucz główny i czy da się ją połączyć z pozostałymi kluczem obcym.
Najczęściej zadawane pytania o normalizację baz danych
Co to jest normalizacja baz danych?
To proces dzielenia danych na powiązane tabele tak, żeby ograniczyć powtórzenia i uniknąć anomalii przy dodawaniu, zmianie i usuwaniu danych.
Czym różni się 2NF od 3NF?
2NF usuwa zależności od części klucza złożonego. 3NF usuwa zależności między kolumnami, które nie są częścią klucza.
Czy tabela z kluczem z jednej kolumny jest w 2NF?
Jeśli jest w 1NF, to tak, bo nie ma części klucza, od której można by częściowo zależeć.
Czy zawsze trzeba normalizować do 3NF?
W nauce i w typowych aplikacjach to dobry standard. W systemach analitycznych czasem stosuje się denormalizację dla szybkości.
Czy normalizacja usuwa wszystkie powtórzenia?
Nie. Klucze obce powtarzają się z założenia, bo łączą tabele. Usuwa się powtórzenia opisów, a nie powiązań.
Stan na listopad 2026 r.

Pingback: Klucz główny i obcy w SQL - różnice i przykłady