Trenér vede docházku do kroužků v jedné velké tabulce. U každého zápisu opisuje jméno žáka, jeho třídu, název kroužku i jméno vedoucího. Když vedoucí kroužku změní příjmení, musí ho přepsat na sto řádcích. Jeden přehlédne a tabulka si začne odporovat.
Normalizace je postup, jak takovou tabulku rozdělit na menší, aby se každý údaj ukládal jen jednou. Postupuje se po stupních, kterým se říká normální formy: 1NF, 2NF, 3NF.
id_zaka → jmeno: číslo žáka určuje jeho jméno.| Forma | Podmínka | Zkráceně |
|---|---|---|
| 1NF | všechny hodnoty jsou atomické, žádné seznamy v buňce ani opakující se sloupce (tel1, tel2, tel3), tabulka má primární klíč | jedna buňka = jedna hodnota |
| 2NF | je v 1NF a každý neklíčový sloupec závisí na celém primárním klíči, ne jen na jeho části | žádná částečná závislost |
| 3NF | je v 2NF a žádný neklíčový sloupec nezávisí na jiném neklíčovém sloupci | žádná tranzitivní závislost |
Starý pomocný výrok to shrnuje: každý neklíčový sloupec závisí „na klíči (1NF), na celém klíči (2NF) a na ničem jiném než na klíči (3NF)“.
| id_zaka | jmeno | telefony |
|---|---|---|
| 1 | Eva Malá | 777 111 222, 603 333 444 |
telefony obsahuje seznam a jmeno spojuje jméno a příjmení. Rozdělíš jmeno na jmeno a prijmeni a telefony dáš do samostatné tabulky telefon(id_zaka, cislo), jeden telefon na řádek. Teď je každá hodnota atomická.dochazka(id_zaka, id_krouzku, jmeno_zaka, nazev_krouzku, datum_prihlaseni) s klíčem (id_zaka, id_krouzku). Je v 2NF?jmeno_zaka závisí jen na id_zaka a nazev_krouzku jen na id_krouzku, tedy na části klíče. Rozděl na zak(id_zaka, jmeno_zaka), krouzek(id_krouzku, nazev_krouzku) a dochazka(id_zaka, id_krouzku, datum_prihlaseni). Datum závisí na celém klíči, zůstává.Částečná závislost znamená závislost na části klíče. Klíč z jednoho sloupce žádnou část nemá.
Malý e-shop si zapisuje objednávky do jedné tabulky v tabulkovém procesoru. Funguje to, dokud má deset objednávek. Pak zákazník změní adresu, zboží zdraží a v tabulce vznikne chaos. Projdeme normalizaci této tabulky krok za krokem, jako u maturitní úlohy.
Cílem je, aby každý údaj byl uložený jen jednou a změna se dělala na jediném místě.
id_zbozi → nazev_zbozidatum závisí jen na cislo_obj, ne na dvojici (cislo_obj, id_zbozi).cislo_obj → id_zakaznika → mestoTabulka objednavky je v 1NF (hodnoty jsou atomické, každá položka objednávky má svůj řádek). Primární klíč je složený: (cislo_obj, id_zbozi).
| cislo_obj | datum | id_zakaznika | jmeno | mesto | id_zbozi | nazev | cena | mnozstvi |
|---|---|---|---|---|---|---|---|---|
| 501 | 3. 9. | 7 | Eva Malá | Brno | 12 | hrnek | 120 | 2 |
| 501 | 3. 9. | 7 | Eva Malá | Brno | 15 | tričko | 350 | 1 |
| 502 | 4. 9. | 9 | Petr Novák | Zlín | 12 | hrnek | 120 | 5 |
cislo_obj → datum, id_zakaznika. id_zbozi → nazev, cena. id_zakaznika → jmeno, mesto. (cislo_obj, id_zbozi) → mnozstvi.cislo_obj, dej do tabulky objednavka. Co závisí jen na id_zbozi, dej do tabulky zbozi. V původní tabulce polozka zůstane jen to, co závisí na celém klíči: mnozstvi.objednavka závisí jmeno a mesto na id_zakaznika, ne přímo na cislo_obj. Přesuň je do tabulky zakaznik.| Tabulka po 3NF | Sloupce (PK tučně) |
|---|---|
| zakaznik | id_zakaznika, jmeno, mesto |
| objednavka | cislo_obj, datum, id_zakaznika (FK) |
| zbozi | id_zbozi, nazev, cena |
| polozka | cislo_obj (FK), id_zbozi (FK), mnozstvi |
zak(id_zaka, jmeno, psc, obec). Platí psc → obec. Je v 3NF?id_zaka → psc → obec je tranzitivní závislost. Rozděl na zak(id_zaka, jmeno, psc) a psc(psc, obec). (Ve skutečnosti jedno PSČ může patřit více obcím, proto se v praxi takto rozděluje opatrně.)Zbytečně rozdělené tabulky jen zpomalují dotazy (víc spojování) a nic nepřinesou.