Přejít na obsah

📐Normalizace databáze

Databázový chaos

Představ si, že někdo vytvořil školní databázi takto:

ŽákTřídaOborPředmět
Jan Novák3.AITDatabáze
Jan Novák3.AITPočítačové sítě
Petra Malá3.AITDatabáze
Petra Malá3.AITProgramování

Na první pohled funguje.

Ale všimni si:

Jan Novák se opakuje.

3.A se opakuje.

IT se opakuje.

Databáze se opakuje.

Čím více žáků a předmětů přidáme, tím větší chaos vznikne.

Co když se něco změní?

Třída 3.A změní obor z:

IT

na:

Informační technologie

Musíme změnit všechny řádky.

A co když jeden zapomeneme?

ŽákTřídaObor
Jan Novák3.AInformační technologie
Petra Malá3.AIT

Máme problém.

Databáze si sama protiřečí.

Řešení: rozdělíme data

Místo jedné obrovské tabulky vytvoříme několik menších.

TRIDA

idnazevobor
13.AInformační technologie

ZAK

idjmenotrida_id
1Jan Novák1
2Petra Malá1

PREDMET

idnazev
1Databáze
2Počítačové sítě
3Programování

ZAPIS

zak_idpredmet_id
11
12
21
23

A přesně takto už funguje databáze, kterou jsme vytvářeli v předchozí kapitole.

Co je normalizace?

Normalizace = rozdělení dat tak, aby se zbytečně neopakovala.

Místo:

Jan Novák – 3.A – IT – Databáze

uložíme zvlášť:

ŽÁKA → TŘÍDU → PŘEDMĚT → ZÁPIS

a spojíme je pomocí ID.

1NF – jedna buňka, jedna hodnota

ŠPATNĚ:

žákpředměty
JanDatabáze, Sítě, Programování

V jedné buňce jsou tři hodnoty.

SPRÁVNĚ:

žákpředmět
JanDatabáze
JanSítě
JanProgramování

Zapamatuj si:

1NF = jedna buňka → jedna hodnota


2NF – každá informace patří někam

Kam patří:

Jan Novák?

→ do tabulky zak

Kam patří:

Databáze?

→ do tabulky predmet

Kam patří:

3.A?

→ do tabulky trida

Proto například tabulka zapis nemusí obsahovat:

Jan Novák

Stačí:

zak_id = 1


3NF – neopakuj informace jiného objektu

ŠPATNĚ:

žáktřídaobor
Jan3.AIT
Petra3.AIT
Lucie3.AIT

Informace IT se stále opakuje.

SPRÁVNĚ:

TRIDA

3.A → Informační technologie

ZAK

Jan → trida_id 1

Petra → trida_id 1

Lucie → trida_id 1

Obor tedy zapisujeme pouze jednou.

Rychlá pomůcka

Při návrhu databáze se vždy ptej:

Opakuje se něco pořád dokola?

Pokud ano, možná potřebuje vlastní tabulku.

Patří tato informace opravdu sem?

Například:

  • jméno → žák

  • obor → třída

  • název předmětu → předmět

  • datum zápisu → zápis

Databázová výzva

Máme tabulku:

žáktřídaoborpředmět
Jan Novák3.AITDatabáze
Jan Novák3.AITSítě
Petra Malá3.AITDatabáze
Tomáš Veselý3.BElektrotechnikaSítě

Tvůj úkol:

Rozděl ji na tabulky:

TRIDA

ZAK

PREDMET

ZAPIS

A urči, kde budou:

  • primární klíče,

  • cizí klíče.

Výsledek nakresli v drawDB.

Co si zapamatovat

Normalizace

odstraňuje zbytečné opakování dat

1NF

jedna buňka = jedna hodnota

2NF

každá informace patří správnému objektu

3NF

neopakujeme údaje, které patří do jiné tabulky

A nejdůležitější pravidlo:

Když stejnou informaci píšeš pořád dokola, něco je pravděpodobně špatně.

V tomto kurzu nejsou povoleny komentáře.