Bazy Danych

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_zamklientmiastokod_miastaproduktydata
1Anna NowakKraków30-001Mysz 50 zł, Klawiatura 120 zł05.11
2Jan KowalGdańsk80-001Mysz 50 zł06.11
3Anna NowakKraków30-001Monitor 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_zamproduktcenaklientmiastokod_miastadata
1Mysz50Anna NowakKraków30-00105.11
1Klawiatura120Anna NowakKraków30-00105.11
2Mysz50Jan KowalGdańsk80-00106.11
3Monitor700Anna NowakKraków30-00107.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ćWarunekCo robisz
1NFjedna wartość w komórce, jest klucz głównyrozbijasz listy na wiersze
2NFbrak zależności od części kluczawydzielasz to, co zależy od części klucza
3NFbrak zależności między kolumnami niekluczowymiwydzielasz 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.

  1. 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.
  2. 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.
  3. 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.

Jeden komentarz do “Normalizacja baz danych: 1NF, 2NF i 3NF na jednym przykładzie”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *