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 typu one-to-many
Chcete-li zastupovat vztah one-to-many, potřebujete alespoň dvě tabulky. Uvidíme proč.
Možná jsme vytvořili tabulku, ve které jsme 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_Název | 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_Název | 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_Název |
---|---|
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.