Vzťah jedna k mnohým v databáze nastane, keď každý záznam v tabuľke A môže mať veľa 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 typu one-to-many v databáze je najbežnejším návrhom relačnej databázy a je základom dobrého dizajnu.
Databázy môžu tiež implementovať vzťah typu one-to-one a mnoho-to-many.
Príklad vzťahu jeden k mnohým
Zvážte vzťah medzi učiteľom a kurzami, ktoré vyučujú. Učiteľ môže učiť viacero tried, ale kurz by nemal rovnaký vzťah s učiteľom.
Pre každý záznam v tabuľke Učitelia môže byť v tabuľke Kurzy veľa záznamov. Tento príklad ilustruje vzťah jeden k mnohým: jeden učiteľ k viacerým kurzom.
Prečo je dôležité nadviazať vzťah medzi jedným a viacerými
Na reprezentáciu vzťahu jeden k mnohým potrebujete aspoň dve tabuľky. Pozrime sa prečo.
Dodržiavanie návrhu prvého normálneho formulára
Možno sme vytvorili tabuľku, do ktorej chceme zaznamenávať meno a vyučované kurzy. Tabuľku učiteľov a kurzov môžeme navrhnúť takto:
Teacher_ID | Teacher_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biológia |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Čo ak Carmen vyučuje dva alebo viac kurzov? S týmto dizajnom máme dve možnosti. Mohli by sme to pridať do existujúceho záznamu Carmen takto:
Teacher_ID | Učiteľ_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biológia, matematika |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Vyššie uvedený dizajn je však neflexibilný a môže spôsobiť problémy neskôr pri vkladaní, úprave alebo odstraňovaní údajov. Sťažuje vyhľadávanie údajov.
Tento návrh tiež porušuje prvý princíp normalizácie databázy, First Normal Form (1NF), ktorý uvádza, že každá bunka tabuľky by mala obsahovať jeden samostatný údaj.
Pravidlo druhej normálnej formy
Ďalšou dizajnovou alternatívou môže byť pridanie druhej nahrávky pre Carmen:
Učiteľ_ID | Učiteľ_Name | Kurz |
---|---|---|
Teacher_001 | Carmen | Biológia |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | angličtina |
Tento prístup dodržiava 1NF, ale stále ide o zlý návrh databázy, pretože zavádza redundanciu a môže zbytočne nafúknuť veľkú databázu. Ešte dôležitejšie je, že údaje môžu byť nekonzistentné.
Čo keby sa napríklad zmenilo meno Carmen? Niekto, kto pracuje s údajmi, môže aktualizovať jej meno v jednom zázname a nedokáže ho aktualizovať v druhom zázname.
Tento dizajn porušuje štandard druhej normálnej formy (2NF), ktorý dodržiava 1NF a musí sa tiež vyhýbať redundanciám viacerých záznamov. Pravidlo 2NF to dosahuje oddelením podmnožín údajov do viacerých tabuliek a vytvorením vzťahu medzi nimi.
Ako navrhnúť databázu s jednotlivými vzťahmi
Ak chcete implementovať vzťah jeden k mnohým v tabuľke Učitelia a Kurzy, rozdeľte tabuľky na dve a prepojte ich pomocou cudzieho kľúča.
Tu sme odstránili stĺpec Kurz v tabuľke Učitelia:
Učiteľ_ID | Učiteľ_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
A tu je tabuľka kurzov. Všimnite si, že jeho cudzí kľúč, Teacher_ID, spája kurz s učiteľom v tabuľke Učitelia:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biológia | Teacher_001 |
Course_002 | Math | Teacher_001 |
Course_003 | angličtina | Teacher_003 |
Vyvinuli sme vzťah medzi učiteľmi a tabuľkou Kurzy pomocou cudzieho kľúča. Toto usporiadanie nám hovorí, že Carmen učí biológiu aj matematiku a že Jorge učí angličtinu.
Vidíme, ako sa tento dizajn vyhýba akýmkoľvek možným prepúšťaniam, umožňuje jednotlivým učiteľom vyučovať viacero kurzov a implementuje vzťah „one-to-many“.