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_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_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 _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 _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é:
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.