07. Normalizacja baz danych
Autor:
Grzegorz Chuchra
Opublikowano:
11 stycznia 2006
Odsłon:
39 652
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.
Komentarze
Tak jak napisane na poczatku artykułu - kropeleczka w morzu!
zyzioone,
10 czerwca 2006, 12:02
A ja na studiach dowiedzialem sie, jest 5 postaci normalnych, a nie trzy.
Kamil.Wisniewski,
21 czerwca 2006, 22:11
poprawka: autor wspomnial jednak o dwoch pozostalych (niedoczytalem artykulu do konca ;/ )
Kamil.Wisniewski,
21 czerwca 2006, 22:17
http://support.microsoft.com/default.aspx?scid=kb%3Bpl%3B283878
SocialS,
22 czerwca 2006, 12:15
takie dziobnięcie tematu jest bez sensu
Robson,
2 listopada 2007, 22:05
Takie dziobnięcie tematu jest wystarczające na 3.0.
Student Informatyki,
22 maja 2008, 17:43
Jak na początek całkiem w porządku. Może i mało ale bardzo jasno.
zksa,
24 października 2008, 15:27
wszystko super fajnie mialem to na studiach w teorii ale gdy klient zyczy sobie zeby w bazie mial te daty urodzenia czy inne takie to tego nie wyrzucisz bo nie mozesz!! wogole nie rozumiem tego tematu bo mozna sie bez niego obyc i to jest raczej dla tych co siedza w tym juz troche czasu a nie dla początkujacych!!
hirek,
4 listopada 2008, 14:57
Cienko.
woytas,
4 maja 2010, 17:01
Trochę bez ładu i składu jak dla mnie wyjaśniony temat. Ogólnie wiem co chciał przekazać autor ale tylko dlatego iż już trochę siedzę w bazach danych.
sloth,
21 sierpnia 2010, 14:50
dla poczatkujacych ok. krotko wyjasniono sens na 2 stronach, zamiast kilkudziesienciu stron zawilych wnioskow na wyklach.
D.,
26 października 2010, 09:23
rekordy w ostatniej tabeli na pierwszej podstronie (StudentID|SubjectID) nie są unikalne, co jest sprzeczne z założeniami bazy danych....
mapiet,
2 stycznia 2011, 20:53
A dlaczego "w tym przypadku znacznie lepszym rozwiązaniem będzie stworzenie tabeli słownikowej"???
Pht,
1 grudnia 2011, 19:15