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.
@STRONA@
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.