Vzťah medzi jednotlivými ľuďmi v databáze sa vyskytuje, keď každý záznam v tabuľke A môže mať mnoho prepojených záznamov v tabuľke B, ale každý záznam v tabuľke B môže mať iba jeden zodpovedajúci záznam v tabuľke A. Vzťah one-to-many v databáza je najbežnejší dizajn relačnej databázy a je jadrom dobrého dizajnu.
Zvážte vzťah medzi učiteľom a kurzmi, ktoré vyučujú. Učiteľ môže vyučovať viacero kurzov, ale kurz by nemal rovnaký vzťah s učiteľom.
Preto pre každý záznam v tabuľke Učitelia by mohlo byť veľa záznamov v tabuľke kurzov. Ide o vzťah jedného k viacerým: jeden učiteľ na viacerých kurzoch.
Prečo je dôležité vytvoriť vzťah medzi jedným a mnohými
Na to, aby ste zastupovali vzťah medzi jedným a viacerými, potrebujete aspoň dve tabuľky. Pozrime sa prečo.
Možno sme vytvorili tabuľku, v ktorej chceme zaznamenať meno a vyučované kurzy. Mohli by sme to navrhnúť takto:
Teacher_ID | TEACHER_NAME | kurz |
---|---|---|
Teacher_001 | carmen | biológie |
Teacher_002 | rozrazil | matematika |
Teacher_003 | jorge | Angličtina |
Čo ak Carmen vyučuje dva alebo viac kurzov? V tomto dizajne máme dve možnosti. Mohli by sme to len pridať k existujúcemu záznamu spoločnosti Carmen, a to takto:
Teacher_ID | učiteľ_Názov | kurz |
---|---|---|
Teacher_001 | carmen | Biológia, Math |
Teacher_002 | rozrazil | matematika |
Teacher_003 | jorge | Angličtina |
Vyššie uvedený návrh je však nepružný a môže viesť k problémom neskôr pri pokuse o vloženie, úpravu alebo vymazanie údajov.
To sťažuje vyhľadávanie údajov. Tento návrh porušuje prvý princíp normalizácie databázy, prvý normálny formát (1NF), ktorý uvádza, že každá bunka tabuľky by mala obsahovať jediný, diskrétny údaj.
Ďalšou konštrukčnou alternatívou by bolo jednoducho pridať druhý záznam pre Carmen:
učiteľ_ID | učiteľ_Názov | kurz |
---|---|---|
Teacher_001 | carmen | biológie |
Teacher_001 | carmen | matematika |
Teacher_002 | rozrazil | matematika |
Teacher_003 | jorge | Angličtina |
Toto sa drží 1NF, ale stále je to slabý dizajn databázy, pretože prináša redundanciu a môže zbytočne nadmerne nadmerne zväčšovať veľkú databázu. Ešte dôležitejšie je, že údaje sa môžu stať nekonzistentné. Napríklad, čo sa zmenilo meno Carmen? Niekto, kto pracuje s údajmi, môže aktualizovať svoje meno v jednom zázname a nedokáže ho aktualizovať v druhom zázname. Tento návrh porušuje Druhý normálny formulár (2NF), ktorý dodržiava 1NF a musí tiež vyhnúť prepúšťaniu viacerých záznamov oddelením podmnožín údajov do viacerých tabuliek a vytvorením vzťahu medzi nimi.
Ako navrhnúť databázu s one-to-Mnoho vzťahov
Na implementáciu vzťahu one-to-many v tabuľke učiteľov a kurzov rozdeľujeme tabuľky na dve a prepájame ich pomocou cudzieho kľúča.
Tu sme odstránili stôl kurz v tabuľke učiteľov:
učiteľ_ID | učiteľ_Názov |
---|---|
Teacher_001 | carmen |
Teacher_002 | rozrazil |
Teacher_003 | jorge |
A tu je tabuľka kurzov. Upozorňujeme, že jeho cudzí kľúč Teacher_ID spája kurz s učiteľom v tabuľke učiteľov:
Course_ID | Názov kurzu | Teacher_ID |
---|---|---|
Course_001 | biológie | Teacher_001 |
Course_002 | matematika | Teacher_001 |
Course_003 | Angličtina | Teacher_003 |
Vytvorili sme vzťah medzi tabuľkou učiteľov a kurzov pomocou cudzieho kľúča.
To nám hovorí, že Carmina je vyučovaná ako biológia, tak aj matematika a Jorge učí angličtinu.
Vidíme, ako sa tento návrh vyhýba akémukoľvek možnému prepúšťaniu, umožňuje individuálnym učiteľom vyučovať viacero kurzov a realizuje vzťah medzi jedným a mnohými.
Databázy môžu tiež implementovať vzájomný vzťah a vzájomný vzťah od mnohých k mnohým.