Jeden-k-Mnoho vztahů v databázi

Vztah mezi jednotlivci 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. Jeden vztah jeden v mnoha databáze je nejběžnější návrh relační databáze a je jádrem dobrého designu.

Zvažte vztah mezi učitelem a kurzy, které učí. Učitel může vyučovat více kurzů, ale kurz by neměl stejný vztah s učitelem.

Proto pro každý záznam v tabulce Učitelé by mohlo být mnoho záznamů v tabulce Kurzy. Jedná se o vztah jeden k mnoho: jeden učitel na více kurzů.

Proč je důležité vytvořit vztah One-to-Many

Chcete-li zastupovat vztah one-to-many, potřebujete alespoň dvě tabulky. Uvidíme proč.

Možná jsme vytvořili tabulku učitelů, ve které bychom chtěli zaznamenat jméno a vyučované předměty. Mohli bychom to navrhnout takto:

Učitelé a kurzy
Učitel_ID Jméno učitele Chod
Teacher_001 Carmen Biologie
Teacher_002 Rozrazil Matematika
Teacher_003 Jorge Angličtina

Co když Carmen vyučuje dva nebo více kurzů? V tomto designu máme dvě možnosti. Mohli bychom ji přidat do existujícího záznamu společnosti Carmen, a to takto:

Učitelé a kurzy
Učitel_ID Učitel _Name Chod
Teacher_001 Carmen Biologie, Matematika
Teacher_002 Rozrazil Matematika
Teacher_003 Jorge Angličtina

Výše uvedený návrh je však nepružný a může způsobit problémy později při pokusu o vkládání, úpravu nebo mazání dat.

Zpřístupňuje vyhledávání dat. Tento návrh poruší první princip normalizace databáze, First Normal Form (1NF) , který uvádí, že každá buňka tabulky by měla obsahovat jediný, diskrétní datový soubor.

Dalším alternativním řešením by mohlo být jednoduché přidání druhého záznamu pro Carmen:

Učitelé a kurzy
Učitel _ID Učitel _Name Chod
Teacher_001 Carmen Biologie
Teacher_001 Carmen Matematika
Teacher_002 Rozrazil Matematika
Teacher_003 Jorge Angličtina

To se drží 1NF, ale stále je špatný návrh databáze, protože zavádí redundanci a může zbytečně nabobtnat velice rozsáhlou databázi. Ještě důležitější je, že údaje mohou být nekonzistentní. Například, co se změní jméno Carmen? Někdo, kdo pracuje s daty, může aktualizovat své jméno v jednom záznamu a ve druhém záznamu jej nemůže aktualizovat. Tento návrh porušuje druhou normální podobu (2NF), která dodržuje 1NF a musí se také vyhnout nadbytečnosti více záznamů oddělením podmnožin dat do více tabulek a vytvořením vztahu mezi nimi.

Jak navrhnout databázi s relacemi typu one-to-many

Chcete-li implementovat vztah one-to-many v tabulce učitelů a kurzů, rozdělíme tabulky do dvou a propojíme je pomocí cizího klíče .

Zde jsme odstranili sloupec kurz v tabulce učitelů:

Učitelé
Učitel _ID Učitel _Name
Teacher_001 Carmen
Teacher_002 Rozrazil
Teacher_003 Jorge

A zde je tabulka Kurzy. Všimněte si, že cizí klíč Teacher_ID propojuje kurz s učitelem v tabulce Učitelé:

Kurzy
ID kurzu Název kurzu Učitel_ID
Course_001 Biologie Teacher_001
Course_002 Matematika Teacher_001
Course_003 Angličtina Teacher_003

Vytvořili jsme vztah mezi tabulkou Učitelé a kurzy pomocí cizího klíče.

To nám říká, že Carmen vyučuje jak biologii, tak matematiku a že Jorge učí angličtinu.

Vidíme, jak se tento návrh vyhýbá jakémukoli možnému propouštění, umožňuje jednotlivým učitelům vyučovat více kurzů a zavádí vztah jeden k mnoho.

Databáze mohou také implementovat vztah one-to-one a vztah mnoho k mnoha.