Kapitola6
Normalizace databáze
Poznámka
Je třeba předeslat, že název kapitoly se sice váže k sedmdesátým létům, nikoli však v podmínkách reálného socialismu, ale v oboru navrhování databází.
Souhrn
Tato kapitola se zabývá normalizací databáze a pravidly pro tvorbu relační databáze. Student vysvětlí pojmy primární klíč, cizí klíč, atomicita, funkční závislost, popíše pravidla pro relační databázové systémy a proces normalizace. Dokáže normalizovat databázi z 1. normální formy do BCNF (Boyce-Codd Normal Form) formy. Student navrhne databázi, rozdělí správně atributy do jednotlivých tabulek, definuje domény atributů a vyjádří vztahy mezi jednotlivými tabulkami.
120 hodin
Normalizace je metoda, pomocí níž se upravuje prvotní hrubá nenormalizovaná struktura databáze na strukturu tzv. normalizovanou, která je vyčištěna od formálních chyb a nedostatků. Normalizace fakticky znamená rozdělení atributů do normalizovaných entit. Na jejím konci leží správně navržená databáze. Cílem normalizace, řečeno velice jednoduše, je splnění základního požadavku jeden fakt na jednom místě.
Podle relačního modelu dat musí databáze splňovat následující vlastnosti:
  1. Uživatel chápe databázi jako množinu relací.
  1. V systému řízení báze dat jsou definovány operace projekce, selekce a spojení.
Dr. Codd definoval dalších dvanáct pravidel pro relační databáze:
  1. Informační pravidlo – data uložená v databázi – mohou to být uživatelská data anebo metadata – musí být hodnotou některé z buněk tabulky. Vše v databázi musí být uloženo ve formátu tabulky.
  1. Pravidlo přístupu – Každý jednotlivý datový prvek (hodnota) je logicky přístupná kombinací názvu tabulky, primárního klíče (hodnota řádku) a názvu atributu (sloupce). Pro přístup k datům nelze použít jiné prostředky, například ukazatele.
  1. Systematická oprava hodnot NULL – Hodnoty NULL musí být v databázi systematické a jednotné. Toto je velice důležité pravidlo, protože NULL lze interpretovat jako jednu z následujících hodnot - data chybí, údaje nejsou známy nebo údaje nejsou použitelné.
  1. Aktivní online katalog – Popis struktury celé databáze musí být uložen v online katalogu, známém jako datový slovník, k němuž mohou přistupovat oprávnění uživatelé. Uživatelé mohou používat stejný jazyk dotazu pro přístup do katalogu, který používají pro přístup k samotné databázi.
  1. Pravidlo o jazycích – K databázi lze přistupovat pouze pomocí jazyka s lineární syntaxí, která podporuje definici dat, manipulaci s daty a správu transakcí. Tento jazyk lze použít přímo nebo pomocí nějaké aplikace. Pokud databáze umožňuje přístup k datům bez pomoci tohoto jazyka, považuje se to za porušení pravidla. Dále platí pravidlo pro vytváření pohledů – všechny pohledy, které jsou teoreticky možné, je také možné systémem vytvořit.
  1. Pravidlo vytváření pohledů – Veškeré pohledy v databázi, které mohou být teoreticky aktualizovány, musí být také systémem aktualizovány.
  1. Pravidlo aktualizace dat – Databáze musí podporovat vkládání, aktualizaci a mazání na vysoké úrovni. To nesmí být omezeno na jediný řádek. Databáze tedy musí také podporovat operace UNION a INTERSECT.
  1. Nezávislost fyzických dat – Data uložená v databázi musí být nezávislá na aplikacích, které přistupují k databázi. Jakákoli změna ve fyzické struktuře databáze nesmí mít vliv na to, jak jsou data přístupná externím aplikacím.
  1. Nezávislost logických dat – Logická data v databázi musí být nezávislá na pohledu uživatele nebo aplikace. Jakákoli změna v logických datech nesmí mít vliv na aplikace, které je používají. Pokud jsou například sloučeny dvě tabulky, nebo jedna je rozdělena do dvou různých tabulek, nemělo by dojít k žádným dopadům nebo změnám v uživatelské aplikaci. Jedná se o jedno z nejhůře realizovatelných pravidel.
  1. Integritní nezávislost – Databáze musí být nezávislá na aplikaci, která ji používá. Všechna integritní omezení mohou být nezávisle měněna bez nutnosti jakékoliv změny v aplikaci. Toto pravidlo dělá databázi nezávislou na front-end aplikacích a jejich rozhraní.
  1. Distribuční nezávislost – Koncový uživatel nesmí vidět, že jsou data distribuována na různých místech. Uživatelé by měli mít vždy dojem, že data se nacházejí pouze na jednom místě. Toto pravidlo je považováno za základ distribuovaných databázových systémů.
  1. Pravidlo přístupu – Pokud má systém rozhraní, které umožňuje přístup k záznamům na nízké úrovni, pak toto rozhraní nesmí být schopno podvrátit systém a obejít omezení zabezpečení a integrity.
Pro praktické účely nám postačí, když všechny entity našeho návrhu budou ve formě BCNF (Boyce-Codd Normal Form). Formy 1, 2, 3 nemají sami o sobě prakticky význam, nicméně přes ně vede cesta ke kýžené BCNF.
Pojem, se kterým se setkáváme v průběhu normalizace, je tzv. normální forma. Existuje několik normálních forem. Mluvíme o první, druhé a třetí normální formě, o formě BCNF, případně o čtvrté a páté normální formě.
Z předešlého již víme, co je to primární klíč (PK). Každá entita musí mít primární klíč a volba PK je první a nezbytný krok v procesu návrhu databáze. Primární klíč je složen z jednoho nebo více atributů a má tyto dvě vlastnosti:
  • PK jednoznačně identifikuje každou instanci entity;
  • PK není redundantní. To znamená, že neobsahuje atributy, které nejsou třeba k jednoznačné identifikaci instance.
6.1.1
První normální forma
Databáze je v první normální formě, pokud jsou všechny atributy dále nedělitelné (neboli atomické) a pokud databáze neobsahuje opakující se skupiny atributů.
Podívejme se na tabulku níže. Tato tabulka vykazuje na první pohled problémy – vyhledávání, změna dat – a to v každém sloupci.
Tabulka 3. Nenormalizovaná tabulka
Jmeno
Telefon
Jan Novák
776 145 258;254 255 556
Zdeněk Lysý
125 122 255; 256 585 658
František Tichý
236 565 887
Tato tabulka nemá primární klíč, který by jednoznačně identifikoval každý řádek, a atributy nejsou atomické. Musíme tedy přidat atribut obsahující primární klíč a jednotlivé atributy v tabulce rozdělit.
Tabulka 4. Tabulka v první normální formě
ID
Jmeno
Prijmeni
Telefon1
Telefon2
1
Jan
Novák
776 145 258
254 255 556
2
Zdeněk
Lysý
125 122 255
256 585 658
3
František
Tichý
236 565 887
 
Tato tabulka již obsahuje primární klíč a všechny položky jsou atomické. Můžeme tedy říci, že je v první normální formě.
6.1.2
Druhá normální forma
Databáze je ve druhé normální formě, pokud je v první normální formě a pokud žádný neklíčový atribut není závislý pouze na části klíče. Jinými slovy to znamená, že pokud chceme znát hodnotu nějakého atributu, neměla by stačit pouze znalost části klíče daného záznamu. Tento problém automaticky odpadá v případě, že má entita pouze jednoduchý klíč. V tom případě je databáze ve druhé normální formě ihned, jakmile je v první normální formě.
V následujícím příkladu (tabulka níže) je vidět, že se tabulka nachází v první normální formě – má primární klíč a atributy jsou atomické. Problém ovšem je, že primární klíč tvoří kombinace atributů.
Tabulka 5. Tabulka splňující první normální formu
Nazev_Vyrobku
Vyrobce
Vyrobce_Mesto
Cena_Vyrobku
Mnozstvi_Na_Sklade
Přírodní minerální voda
Hanácká kyselka
Horní Moštěnice
10
120
Pramenitá voda
Hanácká kyselka
Horní Moštěnice
12
300
Přírodní minerální voda
Mattoni
Karlovy Vary
14
150
Pramenitá voda
Mattoni
Karlovy Vary
16
145
Pramenitá voda
Rajec
Rajec
18
25
Primární klíč této tabulky tvoří kombinace sloupců Nazev_vyrobku a Vyrobce. Touto kombinací lze v tabulce identifikovat každý řádek. Bohužel pro identifikaci nestačí pouze jeden sloupec – jak je patrné z tabulky. Problém nastává se sloupcem Vyrobce_mesto, který není závislý na celém primárním klíči – je závislý pouze na sloupci Vyrobce. To znamená, že nějaký neklíčový atribut je závislý pouze na části primárního klíče. Tabulka není ve druhé normální formě a je třeba provést dekompozici.
Tabulka 6. Tabulka Vyrobek
ID_Vyrobce
Nazev_Vyrobku
Cena_Vyrobku
Mnozstvi_Vyrobku
1
Přírodní minerální voda
10
120
1
Pramenitá voda
12
300
2
Přírodní minerální voda
14
150
2
Pramenitá voda
16
145
3
Pramenitá voda
18
25
Tabulka 7. Tabulka Vyrobce
Vyrobce_ID
Vyrobce
Vyrobce_Mesto
1
Hanácká kyselka
Horní Moštěnice
2
Mattoni
Karlovy Vary
3
Rajec
Rajec
V tabulce Vyrobek se nachází primární a cizí klíč (ID_Vyrobce), v tabulce Vyrobce je primárním klíčem Vyrobce_ID.
6.1.3
Třetí normální forma
Databáze je ve třetí normální formě, pokud je ve druhé normální formě a pokud žádný neklíčový atribut není závislý na jiném neklíčovém atributu. Jinými slovy, každý neklíčový atribut musí být závislý na klíči, neboli neexistuje tranzitivní závislost neklíčového atributu na klíči.
Tabulka 8. Tabulka Zamestnanec
ID_Zamestnance
Jmeno
Prijmeni
Mesto
PSC
Prac_Pozice
Plat
1
Jan
Novák
Praha 4
140 00
Zedník
25000
2
Zdeněk
Lysý
Vimperk
385 01
Zahradník
26000
3
František
Tichý
Varnsdorf
407 47
Topenář
28000
4
Michal
Soukal
Děčín
405 02
Zahradník
26000
5
Tomáš
Novotný
Praha 4
140 00
Topenář
28000
V přechozí tabulce vidíme sloupce, které jsou závislé na primárním klíči – tím je ID_Zamestnance. Ovšem nalezneme zde také sloupce, které jsou závislé na jiných sloupcích – vidíme závislost poštovního směrovacího čísla a města nebo že plat je závislý na vykonávané práci. Tabulka je tedy ve druhé normální formě, a abychom ji měli i ve třetí normální formě, je zapotřebí provést dekompozici. Z předchozího je zřejmé, že výsledkem budou tři tabulky (Zamestnanec, Mesto, Prac_pozice).
Tabulka 9. Tabulka Zamestnanec
ID_Zamestnance
Jmeno
Prijmeni
ID_Mesto
ID_Prac_Pozice
1
Jan
Novák
1
1
2
Zdeněk
Lysý
2
2
3
František
Tichý
3
3
4
Michal
Soukal
4
2
5
Tomáš
Novotný
1
3
Tabulka 10. Tabulka Mesto
ID_Mesto
Mesto
PSC
1
Praha 4
140 00
2
Vimperk
385 01
3
Varnsdorf
407 47
4
Děčín
405 02
Tabulka 11. Tabulka Pracovni_pozice
ID_Prac_Pozice
Prac_Pozice
Plat
1
Zedník
25000
2
Zahradník
26000
3
Topenář
28000
6.1.4
Boyce Coddova normální forma (BCNF)
Relace se nachází v BCNF, jestliže pro každou netriviální závislost X -> Y platí, že X je nadmnožinou nějakého klíče schématu R. Nejsnáze Boyce/Coddovu normální formu pochopíme s pomocí funkčních závislostí. Boyce/Coddova normální forma v podstatě říká, že mezi kandidátními klíči nesmí být žádná funkční závislost. Uveďme si příklad s adresami.
Tabulka 12. Tabulka Adresy
Mesto
Ulice_nazev
PSC
Praha 4
Bezová
140 00
Vimperk
Krátká
385 01
Varnsdorf
Pražská
407 47
Praha 4
Čimelická
140 00
Kromě toho, že v této tabulce nevidíme na první pohled primární klíč, najdeme zde i dvě závislosti. Jednou závislostí je již zmíněná závislost PSČ na městu a druhou závislostí je závislost atributů Město a Ulice_nazev na poštovním směrovacím čísle. Kombinace sloupců Ulice_nazev a PSC tvoří kandidátní klíč.
Tabulka je tedy ve třetí normální formě, ale není v BCNF. Řešením tohoto problému je tedy dekompozice tabulky. Vzniknou dvě tabulky – tabulka Mesta s atributy PSC a Mesto a tabulka Ulice s atributy PSC a Ulice_nazev.
Tabulka 13. Tabulka Mesta
PSC
Mesto
Praha 4
140 00
Vimperk
385 01
Varnsdorf
407 47
Tabulka 14. Tabulka Ulice
Ulice_nazev
PSC
Bezová
140 00
Krátká
385 01
Pražská
407 47
Čimelická
140 00