Mezi dvěma databázovými tabulkami vzniká vztah, pokud má jedna tabulka cizí klíč, který odkazuje na primární klíč jiné tabulky. Jedná se o základní pojetí relační databáze.
Jak funguje cizí klíč k vytvoření vztahu
Pojďme se podívat na základy primárních a cizích klíčů. Primární klíč jednoznačně identifikuje každý záznam v tabulce. Jedná se o typ kandidátského klíče, který je obvykle první sloupec v tabulce a může být automaticky generován databází, aby bylo zajištěno, že je jedinečný.
Cizí klíč je jiný kandidátní klíč (nikoli primární klíč), který slouží k propojení záznamu s daty v jiné tabulce.
Zvažte například tyto dvě tabulky, které určují, který učitel učí, který kurz.
Zde je primární klíč tabulky Kurzy identifikátor Course_ID. Jeho cizí klíč je Teacher_ID:
ID kurzu | Název kurzu | Učitel_ID |
---|---|---|
Course_001 | Biologie | Teacher_001 |
Course_002 | Matematika | Teacher_001 |
Course_003 | Angličtina | Teacher_003 |
Můžete vidět, že cizí klíč v kurzech odpovídá primárnímu klíči učitelů:
Učitel_ID | Jméno učitele |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Rozrazil |
Teacher_003 | Jorge |
Můžeme říci, že cizí klíč Teacher_ID pomohl vytvořit vztah mezi kurzy a tabulkami učitelů.
Typy databázových vztahů
Pomocí cizích klíčů nebo jiných kandidátských klíčů můžete implementovat tři typy vztahů mezi tabulkami:
Jeden-k-jeden: Tento typ vztahu dovoluje pouze jeden záznam na každé straně vztahu.
Primární klíč se týká pouze jednoho záznamu - nebo nikoli - v jiné tabulce. Například v manželství má každý z manželů pouze jednoho dalšího manžela. Tento druh vztahu může být implementován v jedné tabulce, a proto nepoužívá cizí klíč.
Jedno-k-mnoho: Vztah one-to-many umožňuje, aby jeden záznam v jedné tabulce byl spojen s více záznamy v jiné tabulce.
Zvažte firmu s databází, která má tabulky Zákazníci a Objednávky.
Jeden zákazník si může zakoupit několik objednávek, ale jedna objednávka nemůže být propojena s více zákazníky. Tabulka objednávek by tedy obsahovala cizí klíč, který odpovídal primárnímu klíči tabulky Zákazníci, zatímco tabulka Zákazníci by neměla žádný cizí klíč směřující do tabulky Objednávky.
Mnoho-to-mnoho: Jedná se o složitý vztah, ve kterém mnoho záznamů v tabulce může odkazovat na mnoho záznamů v jiné tabulce. Například naše podnikání pravděpodobně potřebuje nejen tabulky Zákazníci a Objednávky, ale pravděpodobně potřebuje také tabulku Produkty.
Opět platí, že vztah mezi tabulkou Zákazníci a Objednávky je jeden k mnoha, ale zvažte vztah mezi tabulkou Objednávky a Produkty. Objednávka může obsahovat více produktů a produkt může být spojen s několika objednávkami: několik zákazníků může odeslat objednávku, která obsahuje některé stejné produkty. Tento druh vztahu vyžaduje minimálně tři tabulky.
Co jsou vztahy s databázemi důležité?
Vytváření konzistentních vztahů mezi tabulkami databáze pomáhá zajistit integritu dat a přispívá k normalizaci databáze. Například, co bychom neměli odkazovat žádné tabulky přes cizí klíč a namísto toho jsme jen sloučili data v tabulkách Kurzy a učitelé, a to takto:
Učitel_ID | Jméno učitele | Chod |
---|---|---|
Teacher_001 | Carmen | Biologie, Matematika |
Teacher_002 | Rozrazil | Matematika |
Teacher_003 | Jorge | Angličtina |
Tento návrh je nepružný a porušuje 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.
Nebo snad jsme se rozhodli jednoduše přidat druhou nahrávku pro Carmen, abychom prosadili 1NF:
Učitel_ID | Jméno učitele | Chod |
---|---|---|
Teacher_001 | Carmen | Biologie |
Teacher_001 | Carmen | Matematika |
Teacher_002 | Rozrazil | Matematika |
Teacher_003 | Jorge | Angličtina |
Je to stále slabý design, který zavádí zbytečnou duplikaci a to, co se nazývá anomálie vkládání dat , což jen znamená, že by mohlo přispět k nekonzistentním datům.
Například pokud učitel má více záznamů, co když některé údaje je třeba upravit, ale osoba, která provádí úpravy dat, si neuvědomuje, že existuje více záznamů? Tabulka by pak obsahovala různá data pro stejnou osobu, aniž by měla jasný způsob, jak ji identifikovat nebo se jí vyhnout.
Zrušení této tabulky do dvou tabulek, Učitelé a kurzy (viz výše), vytváří správný vztah mezi daty a proto pomáhá zajistit konzistenci a přesnost dat.