Przez wiele lat jak czytałem o projektowaniu baz danych i postaciach normalnych to miałem wrazenie, ze wszyscy zaczynają tę opowieść od środka, jakby na początku coś waznego pomijali. Ostatnio odnalazłem ten brakujący początek i od razu wiele rzeczy stało się prostszych. Słuchajcie:

o co chodzi w projektowaniu baz danych

Wiedza o świecie składa się z faktów, które można wyrażać zdaniami. Kiedy mamy dużo podobnych zdań, możemy zapisywać je jako formę zdaniową i słowa, które mają być w nią wstawione.

Oto przykład. Forma zdaniowa:

W mieście (tu wstaw nazwę miasta) mieszka człowiek, co nazywa się (tu wstaw imię) (tu wstaw nazwisko); jego PESEL to (tu wstaw PESEL); jego (tu wstaw słowo „syn” albo „córka”) ma na imię (tu wstaw imię).

Słowa do wstawienia:

miasto

imię rodzica

nazwisko rodzica

PESEL

syn/córka

imię dziecka

Białystok

Antoni

Boratyński

74120312875

syn

Teodor

Białystok

Antoni

Boratyński

74120312875

córka

Zuzia

Białystok

Michalina

Domejko

83120965123

syn

Zachary

Warszawa

Jerzy

Grudko

69110876198

syn

Tomasz

Warszawa

Jerzy

Grudko

69110876198

syn

Dawid

Kiedy trzymamy wiedzę w relacyjnej bazie danych, to w tabelach trzymamy słowa do wstawienia, a formy zdaniowe nie są przechowywane nigdzie w bazie danych – istnieją tylko w naszym umyśle.

Zauważmy, że w powyższej tabeli jeśli powtórzy się napis w kolumnie PESEL, to na pewno będzie przy nim to samo imię rodzica, nazwisko rodzica i miasto. W takiej sytuacji mówimy, że jest zależność funkcyjna między tymi kolumnami: kolumny imię rodzica, nazwisko rodzica i miasto zależą od kolumny PESEL.

Dobra praktyka każe unikać sytuacji, kiedy jedna zależność funkcyjna jest przechowywana w bazie danych kilka razy. To znaczy, że jeśli imię rodzica, nazwisko rodzica i miasto zależą od kolumny PESEL, to w tej tabeli PESEL nie powinien się powtarzać. Zwykle ten cel da się osiągnąć – choć czasem się nie da (przykład: https://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form#Achievability_of_BCNF). Jeśli da się go osiągnąć, to da się go osiągnąć przez podzielenie tabel na mniejsze. W naszym przypadku:

Tabela do formy zdaniowej W mieście (tu wstaw nazwę miasta) mieszka człowiek, co nazywa się (tu wstaw imię) (tu wstaw nazwisko); jego PESEL to (tu wstaw PESEL).

miasto

imię rodzica

nazwisko rodzica

PESEL

Białystok

Antoni

Boratyński

74120312875

Białystok

Michalina

Domejko

83120965123

Warszawa

Jerzy

Grudko

69110876198

Tabela do formy zdaniowej Człowiek o peselu (tu wstaw PESEL) ma dziecko typu (tu wstaw słowo „syn” albo „córka”), które ma na imię (tu wstaw imię).

PESEL

syn/córka

imię dziecka

74120312875

syn

Teodor

74120312875

córka

Zuzia

83120965123

syn

Zachary

69110876198

syn

Tomasz

69110876198

syn

Dawid

To wszystko.