Než se postaví dům, nakreslí architekt plán. Na papíře se chyba opraví gumou, v hotovém domě je to drahé. Databáze se staví stejně. Než vytvoříš tabulky, nakreslíš ER diagram: co budeš evidovat a jak to spolu souvisí.
ER diagram čte zadavatel (ředitel, majitel firmy) i programátor. Je to společný jazyk, ve kterém se domluví, co má databáze umět.
| Značka | Význam |
|---|---|
| obdélník | entitní typ (Žák, Třída) |
| ovál | atribut (jméno); podtržený = identifikátor |
| kosočtverec | vztah (chodí do) |
| čára | spojuje atribut s entitou a entitu se vztahem; u čáry se píše kardinalita |
V praxi se často kreslí i notace vraní nohy (crow's foot): atributy jsou vypsané uvnitř obdélníku a kardinalita je značka na konci čáry. Rozvětvená „noha“ znamená „mnoho“.
| Kardinalita | Čte se | Příklad |
|---|---|---|
| 1:1 | jedna k jedné | Třída – Třídní učitel (každá třída má jednoho třídního, učitel je třídním nejvýš jedné třídy) |
| 1:N | jedna k mnoha | Třída – Žák |
| M:N | mnoho k mnoha | Žák – Kroužek (žák chodí do více kroužků, kroužek má více žáků) |
Roztřiď vztahy podle kardinality. U každého se zeptej z obou stran.
Kardinalita popisuje oba směry vztahu. Z jedné otázky nepoznáš, jestli jde o 1:N, nebo M:N.
Diagram je hezký, ale databáze potřebuje tabulky. Převést ER diagram na tabulky je mechanická práce s jasnými pravidly. U maturity z databází je to jedna z nejčastějších úloh.
Ukážeme si pravidla na malé škole: třídy, žáci a kroužky.
zak.id_tridy odkazuje na trida.id_tridy.zak_krouzek(id_zaka, id_krouzku).| Tabulka | Sloupce |
|---|---|
| trida | id_tridy (PK), nazev |
| zak | id_zaka (PK), jmeno, prijmeni, id_tridy (FK → trida) |
| krouzek | id_krouzku (PK), nazev, den |
| zak_krouzek | id_zaka (FK → zak), id_krouzku (FK → krouzek), datum_prihlaseni; PK = (id_zaka, id_krouzku) |
Třída – Žák je 1:N, proto má žák sloupec id_tridy. Žák – Kroužek je M:N, proto vznikla vazební tabulka zak_krouzek.
id_krouzku v tabulce zak?objednavka: sloupec id_zakaznika. Každá objednávka zná svého zákazníka. Opačně by zákazník potřeboval seznam objednávek v jedné buňce.Třída má mnoho žáků, ale do jednoho sloupce se vejde jen jedno id. Žák má právě jednu třídu, takže jeden sloupec stačí.