Vztah je vytvořen mezi dvěma databázovými tabulkami, když jedna tabulka používá cizí klíč, který odkazuje na primární klíč jiné tabulky. Toto je základní koncept termínu relační databáze.
Jak cizí klíč funguje k navázání vztahu
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ím sloupcem v tabulce a může být automaticky generován databází, aby byla zajištěna jeho jedinečnost. Cizí klíč je další kandidátský klíč (nikoli primární klíč), který se používá k propojení záznamu s daty v jiné tabulce.
Podívejte se například na tyto dvě tabulky, které určují, který učitel vyučuje který kurz. Zde je primárním klíčem tabulky Courses Course_ID. Jeho cizí klíč je Teacher_ID:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biologie | Teacher_001 |
Course_002 | Math | Teacher_002 |
Course_003 | angličtina | Teacher_003 |
Můžete vidět, že cizí klíč v Kurzech odpovídá primárnímu klíči v Učitelích:
Teacher_ID | Teacher_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Můžeme říci, že cizí klíč Teacher_ID pomohl vytvořit vztah mezi tabulkami Kurzy a 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:
One-to-One
Tento typ vztahu umožňuje pouze jeden záznam na každé straně vztahu. Primární klíč se vztahuje pouze k jednomu záznamu (nebo žádnému) v jiné tabulce. Například v manželství má každý z manželů pouze jednoho dalšího manžela. Tento druh vztahu lze implementovat v jedné tabulce, a proto nepoužívá cizí klíč.
One-to-Many
Vztah one-to-many umožňuje, aby jeden záznam v jedné tabulce byl spojen s více záznamy v jiné tabulce. Představte si firmu s databází, která obsahuje tabulky Zákazníci a Objednávky.
Jeden zákazník může zakoupit více objednávek, ale jednu objednávku nelze propojit s více zákazníky. Tabulka Orders by tedy obsahovala cizí klíč, který by odpovídal primárnímu klíči tabulky Customers, zatímco tabulka Customers by neměla žádný cizí klíč ukazující na tabulku Orders.
Many-to-Many
Jedná se o komplexní vztah, ve kterém se mnoho záznamů v tabulce může propojit s mnoha záznamy v jiné tabulce. Například naše firma pravděpodobně potřebuje tabulky Zákazníci a Objednávky a pravděpodobně potřebuje také tabulku Produkty.
Vztah mezi tabulkou Zákazníci a Objednávky je opět jeden k mnoha, ale zvažte vztah mezi tabulkou Objednávky a Produkty. Objednávka může obsahovat více produktů a produkt lze propojit s více objednávkami, protože několik zákazníků může odeslat objednávku, která obsahuje některé ze stejných produktů. Tento druh vztahu vyžaduje minimálně tři stoly.
Proč jsou vztahy k databázi důležité?
Vytvoření konzistentních vztahů mezi tabulkami databáze pomáhá zajistit integritu dat a přispívá k normalizaci databáze. Co kdybychom například nepropojili žádné tabulky pomocí cizího klíče a místo toho zkombinovali data v tabulkách Kurzy a Učitelé takto:
Teacher_ID | Teacher_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biologie, matematika |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Tento návrh je neflexibilní a porušuje první princip normalizace databáze, First Normal Form, který říká, že každá buňka tabulky by měla obsahovat jeden samostatný kus dat.
Nebo jsme se možná rozhodli přidat druhý záznam pro Carmen, abychom prosadili 1NF:
Teacher_ID | Teacher_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biologie |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Toto je stále slabý návrh, který zavádí zbytečnou duplikaci a to, čemu se říká anomálie vkládání dat, což znamená, že by to mohlo přispět k nekonzistentnosti dat. Pokud má například učitel více záznamů, co když je třeba některá data upravit, ale osoba provádějící úpravy dat si neuvědomuje, že existuje více záznamů? Tabulka by pak obsahovala různé údaje pro stejnou osobu, aniž by byl jasný způsob, jak ji identifikovat nebo se jí vyhnout.
Rozdělení této tabulky na dvě tabulky, Učitelé a Kurzy, vytváří správný vztah mezi daty, a pomáhá tak zajistit konzistenci a přesnost dat.