En en-til-mange-relasjon i en database oppstår når hver post i tabell A kan ha mange koblede poster i tabell B, men hver post i tabell B kan ha bare én tilsvarende post i tabell A.
Et en-til-mange-forhold i en database er den vanligste relasjonsdatabasedesignen og er kjernen i god design.
Databaser kan også implementere en en-til-en-relasjon og en mange-til-mange-relasjon.
Eksempel på et en-til-mange-forhold
Vurder forholdet mellom en lærer og kursene de underviser i. En lærer kan undervise i flere klasser, men kurset vil ikke ha det samme forholdet til læreren.
Derfor, for hver post i en lærertabell, kan det være mange poster i kurstabellen. Dette eksemplet illustrerer et en-til-mange-forhold: én lærer til flere kurs.
Hvorfor det er viktig å etablere et en-til-mange-forhold
For å representere en en-til-mange-relasjon trenger du minst to tabeller. La oss se hvorfor.
Adherence to First Normal Form Design
Kanskje vi har laget en tabell der vi ønsker å registrere navnet og kursene som undervises. Vi kan designe en lærer- og kurstabell slik:
Teacher_ID | Teacher_Name | kurs |
---|---|---|
Teacher_001 | Carmen | Biology |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Hva om Carmen underviser i to eller flere kurs? Vi har to alternativer med dette designet. Vi kan legge den til Carmens eksisterende rekord, slik:
Teacher_ID | Lærer_Name | kurs |
---|---|---|
Teacher_001 | Carmen | Biologi, matematikk |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Utformingen ovenfor er imidlertid lite fleksibel og kan føre til problemer senere når du setter inn, redigerer eller sletter data. Det gjør det vanskelig å søke etter data.
Denne utformingen bryter også med det første prinsippet for databasenormalisering, First Normal Form (1NF), som sier at hver tabellcelle skal inneholde en enkelt, diskret del av data.
Den andre normalformregelen
Et annet design alternativ kan være å legge til en ny rekord for Carmen:
Lærer_ID | Lærer_Name | kurs |
---|---|---|
Teacher_001 | Carmen | Biology |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Denne tilnærmingen følger 1NF, men er fortsatt dårlig databasedesign fordi den introduserer redundans og kan blåse opp en stor database unødvendig. Enda viktigere, dataene kan bli inkonsekvente.
Hva for eksempel om Carmens navn ble endret? Noen som jobber med dataene kan oppdatere navnet hennes i én post og ikke oppdatere det i den andre posten.
Denne utformingen bryter med Second Normal Form (2NF)-standarden, som følger 1NF og må også unngå redundanser for flere poster. 2NF-regelen oppnår dette ved å separere delsett av data i flere tabeller og opprette en relasjon mellom dem.
Hvordan designe en database med en-til-mange-relasjoner
For å implementere en en-til-mange-relasjon i lærere og kurs-tabellen, del tabellene i to og koble dem sammen med en fremmednøkkel.
Her fjernet vi kurskolonnen i lærertabellen:
Lærer_ID | Lærer_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Og her er kurstabellen. Merk at fremmednøkkelen, Teacher_ID, kobler et kurs til en lærer i lærertabellen:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biology | Teacher_001 |
Course_002 | Math | Teacher_001 |
Course_003 | engelsk | Teacher_003 |
Vi har utviklet et forhold mellom lærer- og kurstabellen ved å bruke en fremmednøkkel. Denne ordningen forteller oss at Carmen underviser i både biologi og matematikk, og at Jorge underviser i engelsk.
Vi kan se hvordan denne utformingen unngår eventuelle oppsigelser, lar individuelle lærere undervise i flere kurs og implementerer et en-til-mange forhold.