W artykule tym chciałbym zająć się jedną z ważniejszych
kwestii związanych z relacyjnymi bazami danych, czyli ich projektowaniem. Z
projektowaniem baz danych wiąże się nierozerwalnie pojęcie normalizacji. I jemu
właśnie chciałbym poświęcić kolejnych kilka stron. Dowiemy się, czym jest sama
normalizacja, dlaczego została zdefiniowana i tak właściwie dlaczego powinniśmy
zawracać sobie nią głowę.
Artykuł ten zawiera dużą dawkę teorii, lecz jest to zaledwie kropla w morzu
całego tematu związanego z pojęciem normalizacji. Jeśli ktoś będzie chciał
bardziej poważnie zagłębić się w tym temacie polecam książkę J.D. Ulmana lub W.
Cellarego.
Czym więc jest normalizacja?
Najprościej mówiąc jest to proces polegający na wyeliminowaniu z bazy dany
wszelkiej nadmiarowości. A to z kolei prowadzi do zmniejszenia ilości
przechowywanych danych oraz wyeliminowaniu prawdopodobieństwa powstania
anomalii i zniekształceń podczas codziennej eksploatacji.
Najłatwiej będzie to zrozumieć na przykładzie.
Przed
Po
Jak widać dzięki tej operacji udało nam się zmniejszyć ilość danych, jakie są przechowywane w repozytorium. Z każdym dodatkowym użytkownikiem zysk będzie coraz większy. Można jednak uczynić strukturę bazy jeszcze bardziej klarowną. Dodatkowy atutem będzie elastyczność jaka dzięki temu zostanie uzyskana.
Jeśli zaszłaby konieczność zmiany imienia użytkownika, nie trzeba przeszukiwać kolejno wszystkich wierszy w tabeli i przeprowadzać operacji uaktualnienia. Teraz wystarczy zmienić imię w tabeli Student, bez konieczności kosztownej operacji zmiany wielu wierszy. Tak powoli zbliżyliśmy się do zdefiniowania pierwszej postaci normalnej która głosi:
Pierwsza postać normalna
- w poszczególnych tabelach wyeliminuj powtarzające się grupy
- dla każdego zestawu danych pokrewnych utwórz oddzielną tabelę
- dla każdego zestawu danych pokrewnych określ klucz podstawowy
Skoro już jesteśmy przy definicjach to możemy się pokusić o przytoczenie kolejnych postaci normalnych:
Druga postać normalna
- utwórz oddzielne tabele dla zestawów wartości odnoszących się do wielu rekordów
- ustal powiązania tabel za pomocą klucza obcego
Przypuśćmy, że rozważamy przeprowadzanie raportów w dziekanacie jednej z wyższych uczelni. Dane dotyczące studenta: imię, nazwisko znajdują się zarówno w tabeli związanej z stypendiami, zajęciami itp. W takiej sytuacji nie ma potrzeby przechowywać danych personalnych w każdej z tabel. Robimy więc dodatkową tabelkę ze studentami gdzie wpisujemy dane o studencie. Tak jak zostało to pokazane w powyższym przykładzie.
Trzecia postać normalna
- wyeliminuj pola, które nie zależą od klucza
Jeśli w naszej tabeli studentów mamy wpisy dotyczące studentów z wymiany, wypada dodać kolejne kolumny dotyczące kraju, z jakiego pochodzą. Jednak w tym przypadku znacznie lepszym rozwiązaniem będzie stworzenie tabeli słownikowej (z góry ustalona lista państw) gdzie będziemy przechowywać dane dotyczące kraju, a dla każdego ze studentów dodamy tylko powiązanie z krajem, z którego pochodzi.
Tym sposobem wypisaliśmy podstawowe trzy podstawowe postacie normalizacji baz danych. Oprócz nich występuje jeszcze dwie: czwarta i piątak postać normalna. W przeciwieństwie do pierwszych trzech, które są dość intuicyjne, są one dość skomplikowane i wymagają zaprzężenia do samego procesu projektowania elementów matematyki i algorytmiki. W rzeczywistośći jednak nie wpływają one znacząco na wydajność samego repozytorium danych, a jedynie udoskonalają sam projekt.
Podsumowanie
W artykule tym przebrnęliśmy przez bardzo ważny temat z
punktu widzenia poprawnego modelu baz danych. Każdy, kto poważnie myśli o
projektowaniu większego systemu nie może przejść obojętnie obok zagadnienia
normalizacji. Jak wspomniałem normalizacja (przynajmniej w pierwszych trzech
punktach) jest procesem dość intuicyjnym i jest nieświadomie wykonywana przez
większość praktyków.
Ponieważ sam proces jest dość sformalizowany, nie zawsze najlepszy projekt bazy
powstaje przez ślepe podążanie za powyższymi wytycznymi. W największych
systemach informatycznych często łamie się podstawowe zasady normalizacji
uzyskując dzięki temu znacznie wydajniejsze i szybsze systemy. Jednak jeśli
rozpoczynamy naszą przygodę z projektowaniem, powinniśmy dość rygorystycznie
przestrzegać powyższych wskazówek, a z pewnością baza będzie dobrze wykonana.