🔗 ER diagram a kardinality

Plán před stavbou

O čem to je

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.

Nové pojmy

EntitaVěc, osoba nebo událost z reálného světa, o které chceme v databázi uchovávat údaje. Skupině stejných entit se říká entitní typ (entitní množina); z něj později vznikne tabulka.Entitní typ Žák; konkrétní entita je žákyně Eva Malá.
AtributVlastnost entity, kterou evidujeme.Žák: jméno, příjmení, datum narození.
IdentifikátorAtribut (nebo skupina), který jednoznačně rozliší entity stejného typu. V tabulce z něj bude primární klíč.číslo žáka
VztahSouvislost mezi entitami. Pojmenovává se slovesem.Žák chodí do Třídy.
ER diagramEntity-Relationship diagram, obrázek entit, jejich atributů a vztahů. Používá se v konceptuálním návrhu databáze.Obdélník Žák – kosočtverec „chodí do“ – obdélník Třída.

Značky (Chenova notace)

ZnačkaVýznam
obdélníkentitní typ (Žák, Třída)
oválatribut (jméno); podtržený = identifikátor
kosočtverecvztah (chodí do)
čáraspojuje 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

Kardinalita vztahuKolik entit na jedné straně může souviset s kolika entitami na druhé straně. Tři druhy: 1:1, 1:N a M:N.Jedna třída má mnoho žáků, žák chodí do jedné třídy: 1:N.
KardinalitaČte sePříklad
1:1jedna 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:Njedna k mnohaTřída – Žák
M:Nmnoho 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.

Urči kardinalitu vztahu Autor – Kniha.
Ptej se z obou stran. Kolik knih může napsat jeden autor? Mnoho. Kolik autorů může mít jedna kniha? Mnoho (učebnice od tří autorů). Kardinalita je M:N.
Urči kardinalitu vztahu Zákazník – Objednávka v e-shopu.
Jeden zákazník může mít mnoho objednávek. Jedna objednávka patří právě jednomu zákazníkovi. Kardinalita je 1:N.
✗Kardinalitu určím otázkou jen z jedné strany: „Kolik žáků má třída?“ → mnoho, takže M:N.
✓Ptej se z obou stran: třída má mnoho žáků, žák chodí do jedné třídy → 1:N.

Kardinalita popisuje oba směry vztahu. Z jedné otázky nepoznáš, jestli jde o 1:N, nebo M:N.

ER diagram zobrazuje entitní typy (obdélník), atributy (ovál) a vztahy (kosočtverec). Kardinalita vztahu je 1:1, 1:N nebo M:N a určuje se otázkou z obou stran.

Z diagramu tabulky

O čem to je

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.

Nové pojmy

Entitní typ a vztahEntitní typ je skupina stejných věcí, o kterých evidujeme údaje (Žák, Kroužek). Vztah je souvislost mezi nimi (žák navštěvuje kroužek).Žák – navštěvuje – Kroužek
KardinalitaKolik entit může být ve vztahu na každé straně: 1:1, 1:N, M:N.Žák – Kroužek je M:N.
Povinnost (parcialita) vztahuŘíká, jestli entita musí, nebo jen může být ve vztahu. Povinná účast = minimálně 1, nepovinná = minimálně 0.Každý žák musí chodit do třídy (povinné). Do kroužku chodit nemusí (nepovinné).
Primární a cizí klíčPrimární klíč jednoznačně určuje řádek tabulky. Cizí klíč je sloupec, který odkazuje na primární klíč jiné tabulky.zak.id_tridy odkazuje na trida.id_tridy.
Vazební (průniková) tabulkaPomocná tabulka, která rozloží vztah M:N na dva vztahy 1:N. Obsahuje cizí klíče na obě tabulky.Tabulka zak_krouzek(id_zaka, id_krouzku).

Pravidla převodu

Každý entitní typ → tabulka. Atributy → sloupce. Identifikátor → primární klíč.
Vztah 1:N → do tabulky na straně N přidej cizí klíč na stranu 1.
Vztah 1:1 → cizí klíč přidej do jedné z tabulek (obvykle tam, kde je účast nepovinná, nebo tabulky slouč).
Vztah M:N → vytvoř vazební tabulku s cizími klíči na obě strany. Jejím primárním klíčem bývá dvojice těchto cizích klíčů.
Atributy vztahu M:N (např. datum přihlášení) patří do vazební tabulky.

Malá škola

TabulkaSloupce
tridaid_tridy (PK), nazev
zakid_zaka (PK), jmeno, prijmeni, id_tridy (FK → trida)
krouzekid_krouzku (PK), nazev, den
zak_krouzekid_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.

Proč nejde vztah M:N Žák – Kroužek uložit jako sloupec id_krouzku v tabulce zak?
Do jednoho sloupce se vejde jen jeden kroužek. Žák se třemi kroužky by potřeboval tři řádky (a zopakované jméno) nebo seznam v buňce. Obojí je špatně. Řeší to vazební tabulka: každý řádek je jedna dvojice žák–kroužek.
Vztah Zákazník – Objednávka je 1:N. Do které tabulky dáš cizí klíč?
Na stranu N, tedy do tabulky 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.
✗U vztahu 1:N dám cizí klíč na stranu 1 (do tabulky třída sloupec id_zaka).
✓Cizí klíč patří na stranu N: do tabulky žák sloupec id_tridy.

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čí.

Entitní typ → tabulka, identifikátor → primární klíč. U 1:N dej cizí klíč na stranu N. Vztah M:N rozlož vazební tabulkou s cizími klíči na obě strany.