Normalizační proces

řada testů ověřujících, zda relační schéma vyhovuje či nevyhovuje určité normální formě.
1NF, 2NF, 3NF (1972 F. Codd) založeny na koncepci funkčních závislostí mezi atributy tabulky
3.5NF (Boyce) silnější verze 3NF
4NF, 5NF, 6NF založeny na multizávislostech a spojovacích závislostech

První normální forma – 1NF

První, nejjednodušší, normální forma (značíme 1NF) říká, že všechny atributy jsou atomické, tj. dále již nedělitelné (jinými slovy, hodnotou nesmí být relace). Mějme např. tabulku ADRESA, která bude mít sloupce JMÉNO, PŘÍJMENÍ a BYDLIŠTĚ. Naplnění tabulky nechť odpovídá reálnému světu:

JMÉNO PŘÍJMENÍ BYDLIŠTĚ
Jan Novák Ostravská 16, Praha 16000
Petr Nový Svitavská 8, Brno 61400
jan nováček Na bradlech 1147, Ostrava 79002


Pokud bychom v této tabulce chtěli vypsat všechny pracovníky, jejichž PSČ je rovno určité hodnotě, dostali bychom se do potíží, neboť bychom to nemohli zjistit přímo a jednoduše. A to proto, že atribut BYDLIŠTĚ není atomický, skládá se z několika částí: ULICE, ČÍSLO, MĚSTO a PSČ. Správný návrh tabulky, který bude respektovat 1NF bude vypadat následovně:

JMÉNO PŘÍJMENÍ ULICE ČÍSLO MĚSTO PSČ
Jan Novák Ostravská 16 Praha 16000
Petr Nový Svitavská 8 Brno 61400
jan nováček Na bradlech 1147 Ostrava 79002

Obecně bychom se měli snažit, aby obsahem jedné databázové položky byla právě jedna hodnota (určitého databázového typu).

Druhá normální forma – 2NF

Tabulka splňuje 2NF, právě když splňuje 1NF a navíc každý atribut, který není primárním klíčem je na primárním klíči úplně závislý. To znamená, že se nesmí v řádku tabulky objevit položka, která by byla závislá jen na části primárního klíče. Z definice vyplývá, že problém 2NF se týká jenom tabulek, kde volíme za primární klíč více položek než jednu. Jinými slovy, pokud má tabulka jako primární klíč jenom jeden sloupec, pak 2NF je splněna triviálně.
Nechť máme tabulku STUDENTI, která bude vypadat následovně:
TŘÍDA ČÍSLO katalogové JMÉNO PŘÍJMENÍ UČEBNA
I4.E 1 Jan Adámek 214
I.4E 2 Petr Brantl 214
I4.D 1 Milan Babický 212

Jaký primární klíč zvolíme v této tabulce? Pokud zvolíme pouze ČÍSLO katalogové, je to špatně, neboť zcela určitě název třídy, do které student chodí, není závislý na číslu studenta. Takže za primární klíč musíme vzít dvojici (ČÍSLO katalogové, TŘÍDA). Tím nám ovšem vznikl nový problém. Položka UČEBNA není úplně závislá na dvojici zvoleného primární klíče, ale pouze na části TŘÍDA. Ať tedy děláme, co děláme, nejsme schopni vybrat takový primární klíč, aby tabulka splňovala 2NF. Jak z tohoto problému ven? Obecně převedení do tabulky, která již bude splňovat 2NF, znamená rozpad na dvě a více tabulek, kde každá už bude splňovat 2NF. Takovému "rozpadu" na více tabulek se odborně říká dekompozice relačního schématu. Správně navržené tabulky splňující 2NF budou vypadat následovně (tabulka STUDENTI a TŘÍDY):

TŘÍDA ČÍSLO katalogové JMÉNO PŘÍJMENÍ
I4.E 1 Jan Adámek
I4.E 2 Petr Brantl
I4.D 1 Milan Babický


TŘÍDA UČEBNA
I4.E 214
I4.D 212


Dále si všimněte, že pokud tabulka nesplňuje 2NF, dochází často k redundanci. Konkrétně v původní tabulce informace, že pracoviště číslo 10 se jmenuje "studovna", byla obsažena celkem dvakrát. Redundance je jev, který obvykle nesplnění 2NF doprovází. O tom, že redundance je nežadoucí, netřeba pochybovat. Zkuste si rozmyslet, jak byste postupovali v obou příkladech, kdyby ve vaší společnosti došlo ke změně názvu pracoviště číslo 10 ze "studovna" na "klubovna".

Třetí normální forma – 3NF

Relační tabulky splňují třetí normální formu (3NF), jestliže splňují 2NF a žádný atribut, který není primárním klíčem, není tranzitivně závislý na žádném klíči. Nejlépe to opět vysvětlí následující příklad. Mějme tabulku PLATY, která bude vypadat takto:

ČÍSLO JMÉNO PŘÍJMENÍ FUNKCE PLAT
1 Jan Novák technik 21 000,-
2 Petr Nový vedoucí 24 000,-
3 jan nováček správce 22 000,-


Pomineme zatím fakt, že tato tabulka nesplňuje ani 2NF, což je základní předpoklad pro 3NF. Chci zde jen vysvětlit pojem tranzitivní závislost. Nebudeme přemýšlet, co je primární klíč, na první pohled vidíme, že konkrétně atributy JMÉNO, PŘÍJMENÍ a FUNKCE závisí na atributu ČÍSLO (ten by nejspíš byl primárním klíčem). Dále můžeme vidět, že atribut PLAT zřejmě je funkčně závislý na atributu FUNKCE a pokud vememe v úvahu, že ČÍSLO->FUNKCE a FUNKCE->PLAT, dostaneme díky jevu nazývanému tranzitivita, že ČÍSLO->PLAT. Postup, jak dostat tabulky do 3NF, je podobný jako v případě 2NF, tj. opět provedeme dekompozici (tabulka FUNKCE a PLATY):

ČÍSLO JMÉNO PŘÍJMENÍ FUNKCE
1 Jan Novák technik
2 Petr Nový vedoucí
3 jan nováček správce


FUNKCE PLAT
technik 21 000,-
vedoucí 24 000,-
správce 22 000,-


Z hlediska základních tří normálních forem, jsou tyto dvě tabulky již v pořádku. Z praktického hlediska je vhodnější použít nějaký číselník funkcí, abychom splnili podmínku, že primární klíč v tabulkách má být co nejkratší délky. Nejlepší zápis je tedy následující:
ČÍSLO JMÉNO PŘÍJMENÍ ČÍSLO FUNKCE
1 Jan Novák 121
2 Petr Nový 157
3 jan nováček 126


ČÍSLO FUNKCE FUNKCE PLAT
121 technik 21 000,-
157 vedoucí 24 000,-
126 správce 22 000,-