Vztahy jedna k mnoha v databázi
Jeden k mnoha vztah v databázi nastane, když každý záznam v tabulce A může mít mnoho propojených záznamů v tabulce B, ale každý záznam v tabulce B může mít pouze jeden odpovídající záznam v tabulce A.
Vztah one-to-many v databázi je nejběžnějším návrhem relační databáze a je jádrem dobrého návrhu.
Databáze mohou také implementovat a vztah jeden k jednomu a vztah mnoho k mnoha.
Příklad vztahu jeden k mnoha
Zvažte vztah mezi učitelem a kurzy, které vyučují. Učitel může učit více tříd, ale kurz by neměl stejný vztah s učitelem.
Proto pro každý záznam v tabulce Učitelé může existovat mnoho záznamů v tabulce Kurzy. Tento příklad ilustruje vztah jeden k mnoha: jeden učitel k více kurzům.
Proč je důležité navázat vztah typu one-to-many
Chcete-li reprezentovat vztah jedna k mnoha, potřebujete alespoň dvě tabulky. Podívejme se proč.
Dodržování návrhu prvního normálního formuláře
Snad jsme vytvořili tabulku, do které chceme zaznamenávat jméno a vyučované předměty. Můžeme navrhnout tabulku učitelů a kurzů takto:
Učitel_ID | Jméno učitele | Kurs |
---|---|---|
Učitel_001 | Carmen | Biologie |
Učitel_002 | Rozrazil | Matematika |
Učitel_003 | Jorge | Angličtina |
Co když Carmen vyučuje dva nebo více kurzů? S tímto designem máme dvě možnosti. Mohli bychom to přidat do stávajícího záznamu Carmen takto:
Učitel_ID | Učitel_Název | Kurs |
---|---|---|
Učitel_001 | Carmen | Biologie, matematika |
Učitel_002 | Rozrazil | Matematika |
Učitel_003 | Jorge | Angličtina |
Výše uvedený návrh je však neflexibilní a mohl by později způsobit problémy při vkládání, úpravách nebo odstraňování dat. Ztěžuje to vyhledávání dat.
Tento návrh také porušuje první princip normalizace databáze, První normální forma (1NF), který uvádí, že každá buňka tabulky by měla obsahovat jeden samostatný kus dat.
Druhé pravidlo normálního tvaru
Další alternativou návrhu může být přidání druhého záznamu pro Carmen:
Učitel_ID | Učitel_Název | Kurs |
---|---|---|
Učitel_001 | Carmen | Biologie |
Učitel_001 | Carmen | Matematika |
Učitel_002 | Rozrazil | Matematika |
Učitel_003 | Jorge | Angličtina |
Tento přístup se drží 1NF, ale stále jde o špatný návrh databáze, protože zavádí redundanci a může zbytečně zahltit velkou databázi. Ještě důležitější je, že data mohou být nekonzistentní.
Co kdyby se například změnilo jméno Carmen? Někdo, kdo pracuje s daty, může aktualizovat její jméno v jednom záznamu a nepodaří se mu jej aktualizovat ve druhém záznamu.
Tento design porušuje Druhá normální forma (2NF) standard, který dodržuje 1NF a musí se také vyvarovat redundanci více záznamů. Pravidlo 2NF toho dosahuje oddělením podmnožin dat do více tabulek a vytvořením vztahu mezi nimi.
Jak navrhnout databázi s několika vztahy
Chcete-li implementovat vztah jeden k mnoha v tabulce Učitelé a Kurzy, rozdělte tabulky na dvě a propojte je pomocí cizí klíč.
Zde jsme odstranili sloupec Kurz v tabulce Učitelé:
Učitel_ID | Učitel_Název |
---|---|
Učitel_001 | Carmen |
Učitel_002 | Rozrazil |
Učitel_003 | Jorge |
A zde je tabulka kurzů. Všimněte si, že jeho cizí klíč, Teacher_ID, propojuje kurz s učitelem v tabulce Učitelé:
Course_ID | Název kurzu | Učitel_ID |
---|---|---|
Kurz_001 | Biologie | Učitel_001 |
Kurz_002 | Matematika | Učitel_001 |
Kurz_003 | Angličtina | Učitel_003 |
Vyvinuli jsme vztah mezi tabulkou Učitelé a tabulkou Kurzy pomocí cizího klíče. Toto uspořádání nám říká, že Carmen učí biologii i matematiku a že Jorge učí angličtinu.
Můžeme vidět, jak se tento návrh vyhýbá možným nadbytečnostem, umožňuje jednotlivým učitelům vyučovat více kurzů a implementuje vztah „one-to-many“.