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.

Osoba v serverové místnosti.

Erik Isakson / Getty Images

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“.