Zależności funkcyjne pierwotne i wtórne W praktyce, w przypadku konkretnej bazy danych, nie jest zwykle możliwe (ani potrzebne), by projektant określił wszystkie zależności funkcyjne na etapie analizy świata danych. Projektant bazy danych określa więc tylko zależności funkcyjne ewidentne z punktu widzenia semantyki modelowanego świata (nazwijmy je pierwotnymi), a następnie oblicza się w sposób zautomatyzowany te zależności, które wynikają z pierwotnych.
Wprowadza się dwa pojęcia: pojęcie domknięcia F+ zbioru zależności funkcyjnych F oraz pojęcie domknięcia X+ zbioru atrybutów X względem F. Domknięcie F+ to zbiór zależności pierwotnych (tworzących zbiór F) oraz zależności, które można wywnioskować z tamtych. Każda taka nowa zależność musi mieć tę własność, że będzie spełniona dla każdego zbioru danych spełniającego zależności ze zbioru F. Jak zbudować F+?
W 1974 W. Armstrong wykazał, że minimalnym zbiorem reguł wnioskowania potrzebnych do zbudowania domknięcia jest zbiór złożony z reguły zwrotności (R1), reguły zwiększania (R2) i reguły przechodniości (R3). W literaturze są one zwane aksjomatami Armstronga. W praktyce używa się również wtórej reguły: reguły dekompozycji (R4). Systematyczny sposób budowania domknięcia F+ zbioru zależności funkcyjnych F polega na tym, że dla każdej zależności funkcyjnej X Y tworzy się X X+ gdzie X+ to domknięcie zbioru X względem zbioru zależności F. Wszystkie utworzone w ten sposób zależności X X+ tworzą domknięcie F+.
Algorytm obliczania domknięcia zbioru X+ := X repeat old X+:= X+ for each zależność funkcyjna Y Z w F do if old X+VY then old X+:= X+UZ; until (X+ = old X+);
Dwa zbiory zależności funkcyjnych E i F są równoważne jeżeli mają takie same domknięcia: E+=F+. Od projektanta bazy danych wymagamy, by rozpoznał dowolny zbiór pierwotnych zależności funkcyjnych, ale taki, którego domknięcie obejmie wszystkie zależności funkcyjne. Różni projektanci mogą zaproponować różne zbiory zależności pierwotnych, ale muszą być one w powyższym sensie równoważne. Por. R.Elmasri, str. 330-337
Normalizacja Proces prowadzi do kolejnych, coraz lepszych poziomów normalizacji zwanych postaciami normalnymi: pierwszą, drugą, trzecią, Boyce'a-Codda, czwartą i piątą (1NF, 2NF, 3NF, BCFN, ). Proces normalizacji realizujemy przez dekompozycję schematów relacji. Proces ten musi brać pod uwagę właściwość złączenia bezstratnego i właściwość zachowania zależności. Ta druga może być niekiedy pomijana. Atrybut relacji nazywamy podstawowym (prymarnym), gdy należy do któregokolwiek klucza kandydującego. Gdy nie należy do żadnego klucza, to nazywamy go nieprymarnym.
1NF Każdy schemat relacji musi posiadać klucz główny. Dziedzina każdego atrybutu musi zawierać wyłącznie wartości niepodzielne (atomowe), a wartość każdego atrybutu krotki musi być pojedynczą wartością z dziedziny. W takiej sytuacji każdy atrybut jest funkcyjnie zależny od klucza.
BŁĄD 1 Macierze lub listy są ukryte w tabeli poprzez spłaszczenie faktycznej struktury. BŁĄD 2 Używanie kilku kolumn, które mają tę samą wartość semantyczną. BŁĄD 3 Lista wartości wpisana do łańcucha znaków.
2NF Schemat jest w 1NF i żaden nieprymarny atrybut nie jest częściowo zależny od dowolnego klucza. Mówimy krótko, że w tej postaci nie występują zależności częściowe. Rozkład schematu do 2NF polega na pozbyciu się zależności częściowych.
3NF Zależność X A jest nazywana nietrywialną, gdy A nie jest elementem zbioru X. Schemat jest w 2NF i dla każdej nietrywialnej zależności X A albo X jest nadkluczem albo A jest prymarny. Innymi słowy, żaden nieprymarny atrybut nie jest przechodnio zależny od klucza. Musi zależeć od klucza, całego klucza i tylko od klucza! Rozkład schematu do 3NF polega na pozbyciu się zależności przechodnich.
BCNF Jest to silniejsza wersja 3NF. Wymaga się, by dla każdej nietrywialnej zależności X A zbiór atrybutów X był nadkluczem. Przeczytaj rozdział 10 [Ramez Elmasri, Shamkant B. Navathe] Zob. wykład o normalizacji na http://wazniak.mimuw.edu.pl/
Rozkład schematu na podschematy: Praca (NrPracownika, NrProjektu, Data, IleGodzin, Imię, Nazwisko, Termin) KartaPracy (NrPracownika, NrProjektu, Data, IleGodzin) Pracownik (NrPracownika, Imię, Nazwisko) Projekt (NrProjektu, Termin)
Rozkład schematu na podschematy: Uczniowie (NrUcznia, NrKlasy, Wychowawca) Uczniowie (NrUcznia, NrKlasy) Klasy (NrKlasy, Wychowca)
Przykład {UCZEŃ*, JĘZYK*, NAUCZYCIEL} {UCZEŃ, JĘZYK} NAUCZYCIEL NAUCZYCIEL JĘZYK Są możliwe trzy rozkłady: {UCZEŃ*, NAUCZYCIEL*}, {UCZEŃ*, JĘZYK} {JĘZYK, NAUCZYCIEL*}, {JĘZYK*, UCZEŃ*} {NAUCZYCIEL*, JĘZYK}, {NAUCZYCIEL*, UCZEŃ*} Tylko trzeci rozkład, po złączeniu, nie będzie generował fałszywych krotek!