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:
- Uživatel chápe databázi jako množinu relací.
- 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:
- 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.
- 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.
- 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é.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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í.
- 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ů.
- 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 |