Vzťah sa vytvorí medzi dvoma databázovými tabuľkami, keď jedna tabuľka používa cudzí kľúč, ktorý odkazuje na primárny kľúč inej tabuľky. Toto je základný koncept termínu relačná databáza.
Ako cudzí kľúč funguje na nadviazanie vzťahu
Primárny kľúč jedinečne identifikuje každý záznam v tabuľke. Je to typ kandidátskeho kľúča, ktorý je zvyčajne prvým stĺpcom v tabuľke a môže byť automaticky generovaný databázou, aby sa zabezpečila jeho jedinečnosť. Cudzí kľúč je ďalší kandidátsky kľúč (nie primárny kľúč), ktorý sa používa na prepojenie záznamu s údajmi v inej tabuľke.
Zvážte napríklad tieto dve tabuľky, ktoré určujú, ktorý učiteľ vyučuje ktorý kurz. Primárny kľúč tabuľky Courses je tu Course_ID. Jeho cudzí kľúč je Teacher_ID:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biológia | Teacher_001 |
Course_002 | Math | Teacher_002 |
Course_003 | angličtina | Teacher_003 |
Môžete vidieť, že cudzí kľúč v Kurzoch sa zhoduje s primárnym kľúčom v Učiteľoch:
Teacher_ID | Teacher_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Môžeme povedať, že cudzí kľúč Teacher_ID pomohol vytvoriť vzťah medzi tabuľkami Kurzy a Učitelia.
Typy databázových vzťahov
Pomocou cudzích kľúčov alebo iných kandidátskych kľúčov môžete implementovať tri typy vzťahov medzi tabuľkami:
One-to-One
Tento typ vzťahu umožňuje iba jeden záznam na každej strane vzťahu. Primárny kľúč sa týka iba jedného záznamu (alebo žiadneho) v inej tabuľke. Napríklad v manželstve má každý z manželov iba jedného ďalšieho manželského partnera. Tento druh vzťahu môže byť implementovaný v jednej tabuľke, a preto nepoužíva cudzí kľúč.
One-to-Many
Vzťah one-to-many umožňuje, aby jeden záznam v jednej tabuľke súvisel s viacerými záznamami v inej tabuľke. Predstavte si firmu s databázou, ktorá obsahuje tabuľky Zákazníci a Objednávky.
Jeden zákazník si môže zakúpiť viacero objednávok, no jednu objednávku nemožno prepojiť s viacerými zákazníkmi. Preto by tabuľka Objednávky obsahovala cudzí kľúč, ktorý by sa zhodoval s primárnym kľúčom tabuľky Zákazníci, zatiaľ čo tabuľka Zákazníci by nemala žiadny cudzí kľúč smerujúci na tabuľku Objednávky.
Many-to-Many
Ide o komplexný vzťah, v ktorom sa mnohé záznamy v tabuľke môžu spájať s mnohými záznamami v inej tabuľke. Naša firma napríklad pravdepodobne potrebuje tabuľky Zákazníci a Objednávky a pravdepodobne potrebuje aj tabuľku Produkty.
Vzťah medzi tabuľkou Zákazníci a Objednávky je opäť jeden k mnohým, ale zvážte vzťah medzi tabuľkou Objednávky a Produkty. Objednávka môže obsahovať viacero produktov a produkt môže byť prepojený s viacerými objednávkami, pretože niekoľko zákazníkov môže odoslať objednávku, ktorá obsahuje niektoré z rovnakých produktov. Tento druh vzťahu vyžaduje minimálne tri stoly.
Prečo sú vzťahy s databázou dôležité?
Vytvorenie konzistentných vzťahov medzi tabuľkami databázy pomáha zabezpečiť integritu údajov a prispieva k normalizácii databázy. Čo keby sme napríklad neprepojili žiadne tabuľky pomocou cudzieho kľúča a namiesto toho skombinovali údaje v tabuľkách Kurzy a Učitelia takto:
Teacher_ID | Teacher_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biológia, matematika |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Tento návrh je neflexibilný a porušuje prvý princíp normalizácie databázy, First Normal Form, ktorý uvádza, že každá bunka tabuľky by mala obsahovať jeden samostatný údaj.
Alebo sme sa možno rozhodli pridať druhý záznam pre Carmen, aby sme presadili 1NF:
Teacher_ID | Teacher_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biológia |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Toto je stále slabý návrh, ktorý zavádza zbytočnú duplikáciu a takzvané anomálie vkladania údajov, čo znamená, že by to mohlo prispieť k nekonzistentným údajom. Napríklad, ak má učiteľ viacero záznamov, čo ak je potrebné niektoré údaje upraviť, ale osoba, ktorá ich upravuje, si neuvedomuje, že existuje viacero záznamov? Tabuľka by potom obsahovala rôzne údaje pre tú istú osobu bez akéhokoľvek jasného spôsobu, ako ju identifikovať alebo sa jej vyhnúť.
Rozdelenie tejto tabuľky na dve tabuľky, Učitelia a Kurzy, vytvára správny vzťah medzi údajmi, a preto pomáha zabezpečiť konzistentnosť a presnosť údajov.