Normalizacja to proces porządkowania struktury relacyjnej bazy danych tak, żeby te same dane nie powtarzały się w kilku miejscach (redundancja) i żeby trudniej było doprowadzić bazę do stanu, w którym sama sobie przeczy (niespójność). W praktyce sprowadza się to do rozbijania jednej rozdętej tabeli na kilka mniejszych, połączonych ze sobą za pomocą kluczy obcych. Reguły, według których to robisz, nazywamy postaciami normalnymi (normal forms) — wymyślił je Edgar F. Codd, twórca modelu relacyjnego, na początku lat 70.
Działa to schodkowo. 1NF wymaga, żeby każda komórka trzymała jedną, atomową wartość — żadnych list w jednym polu typu "Python, SQL, Git". 2NF mówi, że każda kolumna niekluczowa musi zależeć od całego klucza, a nie od jego fragmentu. 3NF dorzuca warunek, że kolumny nie mogą zależeć od innych kolumn niekluczowych (zależności przechodnie). Wyżej jest jeszcze BCNF, 4NF i 5NF, ale w codziennej robocie 3NF zwykle wystarcza.
Przykład z praktyki
Masz tabelę zamowienia w PostgreSQL i w każdym wierszu trzymasz id_zamowienia, klient_nazwa, klient_email i produkt. Klient Kowalski zamawia 30 razy — i 30 razy zapisujesz jego e-mail. Zmienia adres? Musisz zaktualizować 30 wierszy i modlić się, że żaden nie uciekł (to klasyczna anomalia aktualizacji). Po normalizacji wydzielasz osobną tabelę:
CREATE TABLE klienci (id SERIAL PRIMARY KEY, nazwa TEXT, email TEXT);
a w zamowienia zostawiasz tylko klient_id jako klucz obcy. E-mail klienta żyje teraz w jednym miejscu — zmiana to jeden UPDATE.
Na co uważać
Największy mit to przekonanie, że „im wyższa postać normalna, tym lepiej”. Mocno znormalizowana baza wymaga wielu JOIN-ów, a te kosztują przy odczytach. Dlatego w hurtowniach danych i raportach świadomie robi się denormalizację — celowo dublujesz dane, żeby zapytania były szybsze. To nie błąd, to kompromis: normalizujesz pod spójność zapisu, denormalizujesz pod wydajność odczytu. Drugi częsty błąd to mylenie 1NF z „zakazem przecinków” — chodzi o atomowość znaczeniową, nie o znak w stringu.
Pojęcia powiązane: postacie normalne (1NF, 2NF, 3NF, BCNF), klucz główny i klucz obcy, zależności funkcyjne, denormalizacja, anomalie wstawiania/aktualizacji/usuwania, model relacyjny i integralność referencyjna.