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 učiteľov, 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ľ _Name | 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ľ _Name | 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ľ _Name |
---|---|
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.