Normalizacja baz danych to uporządkowana metoda projektowania relacyjnych baz danych, wprowadzona przez Edgara F. Codda w latach siedemdziesiątych. W bazach relacyjnych dane przechowywane są w oddzielnych strukturach zwanych tabelami. Tabele łączone są ze sobą za pomocą relacji, aby na podstawie rozdzielonych danych móc uzyskać pełne informacje. Przykładowo, informacje o uczniach mogą być w jednej tabeli, a o klasach w innej; relację między nimi realizuje się poprzez klucze (np. identyfikatory), co pozwala przypisać ucznia do jednej lub wielu klas oraz klasie przypisać wielu uczniów.

Tradycyjną alternatywą dla relacyjnych baz danych są bazy płaskie, przypominające strukturą arkusz kalkulacyjny, gdzie wszystkie informacje są w jednym zbiorze. Taka struktura prowadzi często do pustych pól, powtarzania tych samych danych i większego rozmiaru pliku oraz zwiększa ryzyko niespójności i błędów. Relacyjne bazy danych, dzieląc dane na tabele, zmniejszają redundancję i ryzyko błędów, lecz prawidłowe działanie wymaga przemyślanego projektu — tu wchodzi w grę normalizacja.

Normalizacja to zbiór zasad i stopni (tzw. form normalnych), które mają na celu ograniczenie powielania danych i zapobieganie anomaliom aktualizacyjnym. Codd pierwotnie określił trzy podstawowe formy: pierwszą, drugą i trzecią formę normalną. Spełnienie danej formy normalnej eliminuje określone rodzaje problemów z integralnością danych, ale często zwiększa liczbę tabel i złożoność zapytań (więcej połączeń JOIN).

Podstawowe pojęcia

  • Atrybut — kolumna w tabeli opisująca cechę encji (np. imię, nazwisko, data urodzenia).
  • Encja / relacja / tabela — zbiór rekordów opisujących obiekty tego samego typu (np. uczniowie).
  • Klucz główny (primary key) — atrybut lub zestaw atrybutów jednoznacznie identyfikujących rekord w tabeli.
  • Zależność funkcyjna (FD) — relacja typu A → B oznaczająca, że wartość atrybutu A jednoznacznie określa wartość atrybutu B (np. PESEL → data_urodzenia).
  • Atrybuty atomowe — wartości niepodzielne semantycznie (np. lepiej mieć osobne pola imię i nazwisko niż jedno pole "imię_nazwisko").

Formy normalne — co oznaczają i jak je osiągnąć

  • 1NF (pierwsza forma normalna): każda kolumna zawiera wartości atomowe, a każdy rekord jest jednoznaczny. Naruszenie: powtarzające się grupy lub wielowartościowe pola (np. kolumna "telefon" zawierająca wiele numerów rozdzielonych przecinkami). Rozwiązanie: przenieść powtarzające się wartości do osobnej tabeli powiązanej kluczem obcym (np. tabela telefony).
  • 2NF (druga forma normalna): spełniona 1NF oraz każdy niekluczowy atrybut jest w pełni zależny od całego klucza głównego (dotyczy to głównie kluczy złożonych). Naruszenie: częściowa zależność, gdy atrybut zależy tylko od części złożonego klucza. Rozwiązanie: wydzielenie atrybutów zależnych tylko od fragmentu klucza do osobnych tabel.
  • 3NF (trzecia forma normalna): spełniona 2NF oraz nie występują zależności przechodnie między atrybutami niekluczowymi (tj. niekluczowy atrybut nie powinien zależeć od innego niekluczowego atrybutu). Naruszenie: gdy A → B i B → C, a A jest kluczem — wtedy C zależy przechodnio od A. Rozwiązanie: usunięcie atrybutów zależnych przechodnio, przeniesienie ich do odrębnych tabel.
  • BCNF (Boyce–Codd Normal Form): silniejsza wersja 3NF — dla każdej nietrywialnej zależności funkcyjnej X → Y, X musi być superkluczem. Przydatna, gdy w 3NF nadal pozostają nienaturalne zależności.
  • 4NF i 5NF: dotyczą wyższych poziomów normalizacji (m.in. wielowartościowych zależności i dekompozycji z zachowaniem zależności). Stosowane głównie w przypadkach wymagających bardzo rygorystycznej integralności i braku redundancji.

Anomalie, które normalizacja eliminuje

  • Anomalia wstawiania (insertion): niemożność dodania informacji (np. dodanie klasy bez ucznia wymaga wpisu z pustymi polami).
  • Anomalia aktualizacji (update): konieczność wielokrotnej edycji tego samego faktu w wielu miejscach (np. zmiana adresu ucznia w wielu rekordach).
  • Anomalia usuwania (deletion): przypadkowe utracenie danych przy usuwaniu powiązanego rekordu (np. usunięcie ostatniego ucznia z klasy powoduje utratę informacji o klasie).
  • Nadmierna redundancja prowadząca do niespójności i większych wymagań przestrzennych.

Zalety i wady normalizacji

  • Zalety: mniejsza redundancja danych, poprawa integralności i spójności, łatwiejsze utrzymanie i aktualizacje, przewidywalne relacje między danymi.
  • Wady / kompromisy: większa liczba tabel i konieczność łączeń (JOIN) może pogorszyć wydajność odczytów; zbyt głęboka normalizacja może utrudnić pewne zapytania analityczne. Często stosuje się kompromis w postaci denormalizacji tam, gdzie priorytetem są szybkie odczyty.

Praktyczne wskazówki

  • Zwykle dążymy przynajmniej do 3NF — to dobra równowaga między integralnością a wydajnością.
  • Dokumentuj zależności funkcyjne między atrybutami — pozwoli to świadomie projektować dekompozycje tabel.
  • Używaj kluczy surrogate (np. autoinkrementowanych identyfikatorów) tam, gdzie klucze naturalne są skomplikowane lub wielowartościowe.
  • Monitoruj zapytania i tam, gdzie JOIN-y stają się wąskim gardłem, rozważ denormalizację, indeksowanie lub zastosowanie widoków materializowanych.
  • W przypadku relacji wiele-do-wielu stosuj tabelę łącznikową (np. tabela zapisów uczniów do klas), zamiast powielać dane.

Podsumowując, normalizacja baz danych to zestaw zasad pomagających tworzyć przejrzyste, spójne i łatwe w utrzymaniu struktury danych. W praktyce projektant bazy powinien znać formy normalne i zależności funkcyjne, ale też umieć wyważyć wymogi integralności z wymaganiami wydajnościowymi aplikacji.