Normalizacja baz danych jest procesem w ramach którego doprowadzamy bazę danych do postaci normalnych. W przypadku gdy baza danych nie jest znormalizowana występuje redundancja danych.

Ten kurs jest częścią cyklu Kurs SQL

Zapisz się na autorskie Szkolenie SQL

W tym kursie dowiesz się:

  • Czym jest redundancja danych
  • Czym jest postać normalna
    • 1 postać normalna
    • 2 postać normalna
    • 3 postać normalna

Redundancja danych

Redundancja danych w najprostszym wytłumaczeniem jest sytuacją gdy dane się powtarzają np. są zdublowane. Spójrzmy na pierwotną bazę danych pizzerii z poprzedniego kursu: Bazy Danych – Podstawy, Definicje, Przykład. Dla przypomnienia w kursie tworzymy bazę danych dla pizzerii która przechowywać ma następujące dane:

  • Klientów którzy mają atrybuty:
    • Imię
    • Nazwisko
  • Pizza:
    • Nazwa
    • Rozmiar
    • Cena
  • Zamówienia:
    • Data zamówienia
    • Adres

Zobaczmy więc przykład tej bazy w postaci jednej tabeli:

normalizacja baz danych

Gdy spojrzymy na powyższą tabelę widzimy wiele powtarzających się elementów jak np. imię i nazwisko, rozmiar i cena pizzy, adres i data zamówienia. W wymienionych danych występuje redundancja. Redundancja co do zasady nie jest korzystna w bazach danych ponieważ prowadzi do błędów oraz nadmiarowego przechowywania danych. Gdyby Pani Zaradna zmieniła nazwisko na Zaradna-Kowalska to musielibyśmy zaktualizować 4 rekordy. A co jeżeli Anna Zaradna która zamówiła pizzę 3.01.2019 bez podania adresu jest kimś innym niż Anna Zaradna która zamówiła pizze 5.01.2019 na ul. JP2 w Warszawie? Jak je rozróżnić i co zrobić żeby dane nie powtarzały się? Tu z pomocą przychodzą postaci normalne.

Normalizacja baz danych

Normalizacja definicja

Normalizacja baz danych odbywa się poprzez dostosowanie struktury bazy danych do postaci normalnej. Postać normalna jest to postać bazy danych w której nie występuje redundancja danych czyli ich powtarzalność oraz zależność. Występują trzy podstawowe postaci normalne:

  • Pierwsza Postać Normalna (ang. 1 Normal Form lub 1NF)
  • Druga Postać Normalna (ang. 2 Normal Form lub 2NF)
  • Trzecia Postać Normalna (ang. 3 Normal Form lub 3NF)

Występują jeszcze inne postaci normalne ale powyższe są najczęściej wykorzystywane.

Pierwsza Postać Normalna (1NF)

Pierwsza postać normalna występuje gdy każda kolumna jest atomowa tzn. nie zawiera list i dane są niepodzielne.

Przedstawiona tabela nie spełnia pierwszej postaci normalnej (1NF) ponieważ kolumna Adres nie jest atomowa. Możemy ją podzielić na pojedyncze kolumny. Aby więc doprowadzić naszą tabelę do 1NF należy kolumnę adres podzielić na kilka pojedynczych kolumn. Poniższa tabela została tak zmieniona, że spełnia 1NF:

pierwsza postaci normalna

Jak widzimy kolumna ADRES została rozbita na kolumny: ULICA, NR_BLOKU, NR_MIESZKANIA, MIASTO

W tym momencie struktura naszej bazy danych jest w pierwszej postaci normalnej.

Dlaczego ważne jest spełnienie pierwszej postaci normalnej? Wyobraźmy sobie, że chcemy poprawić nazwę ulicy z JP2 na Jana Pawła 2 we Wrocławiu. W tej sytuacji musielibyśmy najprawdopodobniej znaleźć wszystkie adresy które zawierające w JP2. Jak odróżnić ulicę JP2 we Wrocławiu od tej w Warszawie? Czy wtedy byśmy zmienili obie ulice? Jeżeli baza nie jest w pierwszej postaci normalnej nie jesteśmy w stanie wykonać takiej operacji bez błędów.

Druga Postać Normalna (2NF)

Baza danych jest w drugiej postaci normalnej gdy spełnia pierwszą postać normalną oraz wszystkie kolumny w tabeli zależą tylko od klucza. Czy aktualnie baza jest w 2NF? Nie ponieważ jak się zastanowić to z tabeli możemy wyodrębnić przynajmniej trzy zbiory danych zależne od różnych kluczy:

  • Klient
  • Pizza
  • Zamówienie
druga postaci normalna

Powyższe podzielenie tabeli na wymiary pozwala na spełnienie drugiej postaci normalnej:

Co się w zasadzie stało?

Wydzieliliśmy kolumny IMIE i NAZWISKO do osobnej tabeli oraz dodaliśmy unikalny identyfikator czyli kolumnę ID. Jednocześnie usunęliśmy zduplikowane dane. Dzięki temu zabiegowi zmniejszyliśmy redundancję danych.

Wydzieliliśmy kolumny NAZWA, ROZMIAR, CENA do osobnej tabeli oraz dodaliśmy identyfikator ID. Tu też usunęliśmy zduplikowane dane.

Wydzieliliśmy kolumny ULICA, NR_BLOKU, NR_MIESZKANIA i MIASTO do osobnej tabeli oraz dodaliśmy identyfikator ID. Następnie usunęliśmy duplikowane dane.

Tabela z zamówieniami za to otrzymała odnośniki do tabel. Dzięki temu jesteśmy w stanie określić kto, co, gdzie i kiedy zmawiał.

W tej chwili zmiana nazwy ulic we Wrocławiu z JP2 na Jana Pawła 2 jest prosta. Wystarczy aktualizacja jednego rekordu.

Trzecia Postać Normalna (3NF)

Baza jest w trzeciej postaci normalnej wtedy gdy spełnia drugą postać normalną oraz żadna z kolumn nie jest zależna od innej kolumny która nie jest kluczem. Tabela KLIENT spełnia 3NF natomiast tabela PIZZA jej nie spełnia ponieważ kolumna CENA nie jest zależna od klucza a od wielkości pizzy. Aby to zmienić należy dane dotyczące cen wyciągnąć do inny tabeli jak na poniższym schemacie:

trzecia postaci normalna

Jak widzimy Cena została wydzielona do osobnej tabeli dzięki czemu spełniliśmy 3NF. Powyższa baza jest już zgodna z 3NF ale wciąż można zastanowić się nad tabelą z zamówieniami. Widzimy w niej redundancje danych.

Kolejne postaci normalne

W bazach danych występują jeszcze inne postaci normalne jak: Byce-Codde, 4NF, 5NF. Kolejne postaci normalne mówią, że naszą bazę można jeszcze bardziej podzielić. Dla przykładu miasto nie jest bezpośrednio związane z adresem a z ulicą na którą zamawiamy dlatego też ulicę można by wyciągnąć do osobnej tabeli. Nie będę jednak bardziej dzielił naszej bazy 🙂

Podsumowanie

Normalizacja baz danych jest procesem który należy wykonywać po kolei biorąc pod uwagę wymagania biznesowe ponieważ mają one duży wpływ na strukturę bazy danych. Baza danych w trzeciej postaci normalnej jest najczęściej wykorzystywaną formą ponieważ pozwala intuicyjne zaprojektowanie bazy gdzie każda kolumna jest atomowa, baza jest podzielona zgodnie z wymiarami oraz kolumny zależą tylko od klucza.

Zauważmy dodatkowo, że pierwotnie zakładaliśmy, że nasza baza danych będzie składać się z 3 grup danych:

  • Klienci
  • Zamówienia
  • Pizza

Natomiast okazało się w trakcie procesu normalizacji, że nasza baza posiada przynajmniej 5 grup danych:

  • Cena
  • Pizza
  • Zamówienie
  • Adres
  • Klient

Finalnie baza wygląda jak poniżej:

normalizacja baza danych
  • Jeżeli chcesz znaleźć więcej kursów dla średniozaawansowanych oraz poznać zasady optymalizacji zapytań zapoznaj się z pozostałymi kursami, sprawdź: Kurs Oracle SQL
  • Jeżeli chcesz poznać podstawy baz danych i kurs dla początkujących w SQL odwiedź Kurs SQL

2 komentarze

  1. Witam,
    Do tabeli klientów warto dodać ID_adres. W przeciwnym wypadku potem, ciężko będzie powiązać te tabele ze sobą.

    Można oczywiście próbować robić to przez tabelę z zamówieniami, ale tego typu zapytania będą mało efektywne kiedy naszym celem będzie jedynie powiązanie klienta z jego adresem.

    Tabela z ID_pizza powinna zawierać także kolumnę w rodzaju numer_zamówienia, który będzie PK.

    SDA9

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *