Příklad na normalizaci databáze

Na úvod několik poznámek: Je třeba si uvědomit, že v relační databázi tabulky definují uložení dat a vztahy mezi nimi. V tomto příkladě si ukážeme jenom "kousek databáze" - normalizaci jedné tabulky a i z této tabulky vezmeme jen několik řádku. Jde o pochopení principu. Barevně vyznačím primární klíč.
Předem si rovněž uvědomte, že v databázi nebudeme většinou vkládat data do tabulek a manipulovat s nimi. Tabulky zůstanou pro ukládání dat a budou "na pozadí". Pro práci s hodnotami budeme používat sestavy a formuláře. To jen proto, aby vás předem neznechutil rozrůstající se počet tabulek.

Normalizujte tabulku databáze

 
Tabulka hodnocení
Číslo žáka Jméno žáka Vyučující Předmět Hodnocení
123 Petr Něco Chytrá ČJL 1;2;3;1;5;1
124 Jana Velká Dobrá Mat 3;3;3;4;5;
Nenormalizováná tabulka – nedá se vyhledávat/řadit podle příjmení; nedají se dělat průměry známek. Tato tabulka je opravdu nevhodná i jako pouhá tabulka pro uchovávání známek, jako databázová tabulka je k ničemu.
Provedem základní úpravu:
 
Tabulka hodnocení
Číslo žáka Jméno žáka Příjmení žáka Vyučující H-ČJL-1 H-ČJL-2 H-ČJL-3 H-ČJL-4 H-ČJL-5 H-ČJL-6 H-Mat-1 H-Mat-2 H-Mat-3 H-Mat-4 H-Mat-5
123 Petr Něco Chytrá 1 2 3 1 5 1




124 Jana Velká Dobrá





3 3 3 4 5

Výsledek je mnohem lepší – jsem schopen žáka třídit podle jména i příjmení – jsem schopen lépe pracovat se známkami – pokud by bylo dáno, že je maximálěn 6 známek z ČJL a

maximálně 5 z Mat – dalo by se mluvit o normalizaci, ale v reále neznám předem počty známek – takže tabulka není navržena vhodně a budu v normalizaci pokračovat.

První normální forma

 
Tabulka hodnocení
Číslo žáka Jméno žáka Příjmení žáka Vyučující Předmět Hodnocení
123 Petr Něco Chytrá ČJL 1
123 Petr Něco Chytrá ČJL 2
123 Petr Něco Chytrá ČJL 3
123 Petr Něco Chytrá ČJL 1
123 Petr Něco Chytrá ČJL 5
123 Petr Něco Chytrá ČJL 1
124 Jana Velká Dobrá Mat 3
124 Jana Velká Dobrá Mat 3
124 Jana Velká Dobrá Mat 3
124 Jana Velká Dobrá Mat 4
124 Jana Velká Dobrá Mat 5
Máme tabulku v první normální formě - žádne opakující se skupiny. Tabulce nyní chybí primární klíč - můžeme to vyřešít nějakým ID, ale je to zbytečné - tabulka má viditelně mnoho nedostatků, takže ji pojďme upravovat dále.
Vidíme, že v tabulce máme mnoho duplicitních dat, to je ale nepřijatelné - obrovským způsobem nám vzrůstá nebezpečí chyby v případě nějaké změny (jméno vyučujícího, studenta, předmětu).

Druhá normální forma

Postupovat budeme tak, že tabulku rozdělíme na několi „menších“ tabulek
 
Tabulka žáka
Tabulka hodnocení
Číslo žáka Jméno žáka Příjmení žáka
Číslo žáka ID výuky Hodnocení
123 Petr Něco
123 1 1
124 Jana Velká
123 1 2




123 1 3




123 1 1
Tabulka výuky
123 1 5
ID výuky Vyučující Předmět
123 1 1
1 Chytrá ČJL
124 2 3
2 Dobrá Mat
124 2 3




124 2 3




124 2 4




124 2 5

Tohle už vypadá „docela dobře“ - tahle databáze už by byla použitelná, ale pro převod do 3NF je třeba odstranit problém v tabulce výuka – Vyučující a předmět jsou závisli nejen na ID. Ale i na sobě navzájem.

Mohli bychom to vyřešit rozdělením na dvě tabulky – ale mezi nimi by existoval vztah M:N (mnoho:mnoho) – což není ideální, proto tuto tabulku raději rozdělíme na tři.

Třetí normální forma 

 Pouze tabulku výuka rozdělíme na tři tabulky.
 
Tabulka žáka
Tabulka hodnocení
Tabulka předmět
Číslo žáka Jméno žáka Příjmení žáka
Číslo žáka ID výuky Hodnocení ID hodnocení
ID předmět Předmět
123 Petr Něco
123 1 1 1
221 ČJL
124 Jana Velká
123 1 2 2
222 Mat




123 1 3 3







123 1 1 4
Tabulka výuka




123 1 5 5
ID výuky ID vyučující ID předmět




123 1 1 6
1 356 221




124 2 3 7
2 357 222




124 2 3 8







124 2 3 9
Tabulka vyučující




124 2 4 10
ID vyučující Vyučující




124 2 5 11
356 Chytrá









357 Dobrá
A máme výsledek v třetí normální formě.
V tabulce výuka jsou ID vyučující a ID předmět cizími klíči. Tabulky jsou propojeny svými klíči. Vidíte, že všechyn údaje z první tabulky se vyskytují i zde, ale nedochází k dupliakci údajů.
Původní jedna tabulka se nám rozpadla na pět. Výsledek vypadá mnohem složitěji než na začátku, ale výhodou je naprostá jednoznačnost. 

A opět opakuji v reále nemusíme pracovat s těmito tabulkami – ty fungují na pozadí. V reále můžeme klidně pracovat s jedním formulářem, který vypadá podobně jako první tabulka – pokud se vám to takto líbí, ale data se budou na pozadí ukládat do těchto tabulek.

Comments