Kahe andmebaasitabeli vahel luuakse seos, kui üks tabel kasutab võõrvõtit, mis viitab teise tabeli primaarvõtmele. See on mõiste relatsiooniandmebaas taga põhikontseptsioon.
Kuidas välisvõti suhte loomiseks toimib
Esmane võti identifitseerib unikaalselt iga tabeli kirje. See on teatud tüüpi kandidaatvõti, mis on tavaliselt tabeli esimene veerg ja mida andmebaas saab automaatselt genereerida, et tagada selle kordumatus. Võõrvõti on teine kandidaatvõti (mitte primaarvõti), mida kasutatakse kirje linkimiseks teise tabeli andmetega.
Näiteks vaadake neid kahte tabelit, mis näitavad, milline õpetaja millist kursust õpetab. Siin on tabeli Kursused primaarvõti Course_ID. Selle võõrvõti on Teacher_ID:
Kursuse_ID | Kursuse_nimi | Õpetaja_ID |
---|---|---|
Kursus_001 | Bioloogia | Teacher_001 |
Kursus_002 | Matemaatika | Teacher_002 |
Kursus_003 | inglise | Teacher_003 |
Näete, et kursuste välisvõti vastab primaarvõtmele jaotises Teachers:
Õpetaja_ID | Õpetaja_nimi |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Võime öelda, et võõrvõti Teacher_ID aitas luua seose kursuste ja õpetajate tabelite vahel.
Andmebaasisuhete tüübid
Võõrvõtmeid või muid kandidaatvõtmeid kasutades saate rakendada kolme tüüpi tabelite vahelisi seoseid:
Üks-ühele
Seda tüüpi suhe lubab suhte mõlemal poolel ainult ühte kirjet. Esmane võti on seotud ainult ühe kirjega (või mitte ühegi) teises tabelis. Näiteks abielus on kummalgi abikaasal ainult üks teine abikaasa. Sellist seost saab rakendada ühes tabelis ja seepärast ei kasutata võõrvõtit.
Üks-mitmele
Üks-mitmele seos võimaldab ühe tabeli ühe kirje seostada mitme teise tabeli kirjega. Mõelge ettevõttele, mille andmebaas sisaldab klientide ja tellimuste tabeleid.
Üks klient saab osta mitu tellimust, kuid ühte tellimust ei saa siduda mitme kliendiga. Seetõttu sisaldaks tabel Tellimused välisvõtit, mis ühtiks tabeli Kliendid primaarvõtmega, samas kui tabelis Kliendid ei oleks välisvõtit, mis osutaks tabelile Tellimused.
Mitu-mitmele
See on keeruline seos, milles paljud tabeli kirjed võivad linkida paljude teise tabeli kirjetega. Näiteks vajab meie ettevõte tõenäoliselt klientide ja tellimuste tabeleid ning tõenäoliselt ka toodete tabelit.
Jällegi on klientide ja tellimuste tabeli suhe üks paljudele, kuid mõelge tellimuste ja toodete tabeli seostele. Tellimus võib sisaldada mitut toodet ja toode võib olla seotud mitme tellimusega, kuna mitu klienti võivad esitada tellimuse, mis sisaldab mõnda sama toodet. Selline seos nõuab vähem alt kolme tabelit.
Miks on andmebaasisuhted olulised?
Järjepidevate seoste loomine andmebaasi tabelite vahel aitab tagada andmete terviklikkuse, aidates kaasa andmebaasi normaliseerimisele. Näiteks mis siis, kui me ei lingiks ühtegi tabelit võõrvõtme kaudu, vaid ühendaksime andmed tabelites Kursused ja Õpetajad, näiteks:
Õpetaja_ID | Õpetaja_nimi | Kursus |
---|---|---|
Teacher_001 | Carmen | Bioloogia, matemaatika |
Teacher_002 | Veronica | Matemaatika |
Teacher_003 | Jorge | inglise |
See kujundus on paindumatu ja rikub andmebaasi normaliseerimise esimest põhimõtet, First Normal Form, mille kohaselt peab iga tabeli lahter sisaldama ühte diskreetset andmeosa.
Või võib-olla otsustasime lisada Carmenile teise rekordi, et jõustada 1NF:
Õpetaja_ID | Õpetaja_nimi | Kursus |
---|---|---|
Teacher_001 | Carmen | Bioloogia |
Teacher_001 | Carmen | Matemaatika |
Teacher_002 | Veronica | Matemaatika |
Teacher_003 | Jorge | inglise |
See on endiselt nõrk kujundus, mis põhjustab tarbetut dubleerimist ja nn andmete sisestamise kõrvalekaldeid, mis tähendab, et see võib kaasa aidata vastuolulistele andmetele. Näiteks kui õpetajal on mitu kirjet, mis siis, kui osa andmeid on vaja redigeerida, kuid andmete redigeerija ei saa aru, et on olemas mitu kirjet? Tabel sisaldaks siis sama isiku kohta erinevaid andmeid, ilma et oleks võimalik seda selgelt tuvastada või vältida.
Selle tabeli jagamine kaheks tabeliks – Õpetajad ja Kursused – loob andmete vahel õige seose ning aitab seega tagada andmete järjepidevuse ja täpsuse.