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:
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.