Przeczytaj
Postacie normalne
Normalizacja polega na sprowadzaniu bazy danych do jednej z tak zwanych postaci normalnych. Postać normalna to zbiór reguł, które bazy danych powinny spełniać. W sumie istnieje pięć takich postaci (pięć zbiorów reguł), przy czym większość rzeczywistych baz danych ogranicza się do trzeciej postaci normalnej.
Każda kolejna postać normalna jest szczególnym przypadkiem poprzedniej. Oznacza to, że baza danych, która jest w trzeciej postaci normalnej, spełnia także warunki pierwszej oraz drugiej postaci normalnej. Oznacza to także, że baza w piątej postaci normalnej spełnia warunki wszystkich postaci normalnych.
Przedstawia to poniższy schemat:
Reguły pierwszej postaci normalnej
Pierwsza postać normalna zdefiniowana jest przez kilka prostych zasad.
Jedna tabela opisuje jeden obiekt.
Wartości atrybutów są atomoweatomowe.
Tabela nie zawiera powtarzających się informacji.
Znaczenie kolumn nie zależy od ich kolejności.
Tabelę, która nie spełnia któregoś z powyższych warunków, nazywamy nieznormalizowaną. Poniżej, znajduje się przykład tabeli opisującej gości oraz pokoje w hotelu, ta tabela łamie reguły od 1 do 3.
Nieznormalizowana tabela Goscie i Pokoje:
W jaki sposób ta tabela łamie powyższe reguły?
Po pierwsze, tabela ta miesza informację o pokojach z informacjami o gościach, w ten sposób łamiąc zasadę nr 1.
Po drugie, atrybut Goscie zawiera listę, co łamie zasadę 2. Tę i poprzednią kwestię można rozwiązać poprzez rozdzielenie aktualnej tabeli na dwie mniejsze, jedną opisującą gości a drugą pokoje.
Po trzecie, informacja o bieżącej liczbie gości w pokojach znajduje się już w kolumnie Goscie, co oznacza, że kolumna Biezaca_liczba_gosci zawiera powtarzające się informacje.
Tabela nie łamie reguły nr 4, ponieważ, jeśli zamienimy kolejność kolumn, nie zmieni się ich znaczenie. W praktyce złamanie tej reguły może być wynikiem nieuwagi ze strony programisty. Istnieją przykłady łamania tej reguły – lewa kolumna Liczba opisuje aktualną liczbę gości, a prawa – maksymalną.
Teraz kolejność kolumn ma znaczenie (rozróżniamy je na prawą i lewą). W związku z tym ta tabela łamie regułę nr 4 postaci normalnej, ponieważ jeśli zamienimy je miejscem, rekordy zmienią sens - zmieni się informacja o liczbie gości w pokoju.
Doprowadzenie do pierwszej postaci normalnej
Głównym problemem tabel jest próba zamieszczenia zbyt wielu informacji. Może się wydawać, że trzymanie wszystkich informacji w jednym miejscu będzie wygodne. Jednak praktyka pokazuje, że przy takim podejściu w miarę rozbudowywania w bazie pojawiają się wskazane problemy.
Istnieją techniki pozwalające na przekształcenie dowolnej bazy do postaci normalnej.
Pierwszym krokiem jest usunięcie zbędnych informacji. W tym przypadku z tabeli Goscie i Pokoje należy usunąć pole Biezaca_liczba_gosci.
Tabela Goscie i Pokoje po pierwszej poprawce:
W kolejnym kroku należy rozdzielić tabelę Goscie i Pokoje na dwie osobne tabele po to, aby pozbyć się listy w kolumnie Goscie (a dzięki temu ułatwić przyszłą rozbudowę bazy). Jak to zrobić?
Każdy gość może być przypisany do tylko jednego pokoju, ale każdy pokój może być przypisany do wielu gości. Jest to tak zwana relacja 1‑N (jeden pokój - wiele osób).
Po stworzeniu osobnej tabeli Goscie musi być w niej przechowywana kolumna numerów pokoju (po jednym numerze dla każdego gościa).
Nowa tabela Goscie po zastosowaniu zmian:
Zwróć uwagę na to, że teraz każdy gość posiada swój identyfikator (klucz główny)(klucz główny), w formie numeru. Nie możemy używać imienia i nazwiska jako klucza głównego, ponieważ istnieje (stosunkowo mała, ale realna) szansa, że dwóch gości będzie miało to samo imię i nazwisko.
Tabela Pokoje po modyfikacji:
Kolumna Biezaca_liczba_gosci została usunięta, ponieważ była powtórzoną informacją. Jak teraz uzyskać informację o liczbie gości w pokoju, np. w pokoju 1.? Wystarczy policzyć liczbę rekordów w kolumnie Pokoj w tabeli Goscie, w których numer pokoju to 1. W praktyce pisze się zapytania do bazy danych, aby otrzymać tego typu informacje.
Dzięki poprawkom tabele są teraz w pierwszej postaci normalnej.
Ktoś dociekliwy mógłby zapytać, czy powtórzenia numerów pokoi w kolumnie Pokoj nie łamią zasady o niepowtarzaniu informacji.
Powtórzona liczba to nie to samo co powtórzona informacja. Można porównać tę sytuację z oryginalną tabelą Goscie i Pokoje, w której usunięcie kolumny Biezaca_liczba_gosci nie prowadziło do utraty żadnych danych, bo można było policzyć gości w kolumnie Goscie. Natomiast w nowej tabeli Goscie usunięcie numeru pokoju usunie z bazy danych jakąkolwiek informację o tym, gdzie dany gość jest zameldowany.
W tym przypadku numery w kolumnie Pokoj w tabeli Goscie nie stwierdzają wyłącznie istnienia danego pokoju (gdyby tak było, istotnie doszłoby do powtórzenia). Kolumna Pokoj mówi o tym, gdzie dany gość jest zameldowany i jest jedyną instancją tej informacji.
Anomalie
Ważnym aspektem normalizacji jest uniknięcie tak zwanych anomalii wstawiania, usuwania i modyfikacji. Anomalie powodują problemy podczas wykonywania tych operacji.
Tabela przedstawia nauczycieli w pewnej szkole, sale, w których uczą oraz przedmioty przez nich prowadzone.
Anomalia wstawiania
Zachodzi kiedy nie możemy zamieścić jakieś informacji w bazie danych bez dodatkowego zamieszczenia innej informacji.
Jeśli szkoła zatrudni nowego nauczyciela, to nie może go zarejestrować w systemie bez przypisania sali.
Anomalia usuwania
Taka anomalia zachodzi kiedy podczas usunięcia niepotrzebnej informacji jesteśmy zmuszeni usunąć inną, przydatną informację.
Na przykład kiedy nauczyciel tymczasowo przestanie nauczać swoich przedmiotów, to usunięcie informacji o przedmiotach automatycznie usunie wszystkie wzmianki o tym nauczycielu z bazy danych.
Anomalia modyfikacji
Anomalia modyfikacji pojawia się w przypadku, kiedy istnieje możliwość stworzenia sprzeczności wskutek nieprzemyślanej modyfikacji danych.
Załóżmy, że jeden nauczyciel może uczyć wszystkich przedmiotów tylko w jednej sali. Teraz da się zmodyfikować tylko jeden wpis z numerem sali i spowodować sprzeczność w bazie danych.
Słownik
atrybut niepodzielny; na przykład liczba całkowita, ciąg znaków, wartość logiczna
kolumna w tabeli, w której żaden rekord nie może się powtarzać; służy on jako identyfikator wierszy; może to także być wiele kolumn, takich, że żadne dwa wiersze nie posiadają wszystkich wartości takich samych w tych kolumnach (oznacza to, że wartości klucza głównego nie mogą być takie same dla dwóch różnych rekordów)