Et en-til-mange-forhold i en database oppstår når hver post i tabell A kan ha mange sammenhengte poster i tabell B, men hver plate i tabell B kan ha bare en tilsvarende post i tabell A. En til mange forhold i en database er den mest vanlige relasjonsdatabaseutformingen og er hjertet i god design.
Vurder forholdet mellom en lærer og kursene de underviser. En lærer kan lære flere kurs, men kurset vil ikke ha det samme forholdet til læreren.
Derfor, for hver post i et lærerbord, kan det være mange poster i kursbordet. Dette er en til mange forhold: en lærer til flere kurs.
Hvorfor etablere en til mange forhold er viktig
For å representere en til mange forhold, trenger du minst to tabeller. La oss se hvorfor.
Kanskje vi opprettet et bord der vi ønsket å registrere navn og kurs undervist. Vi kan utforme det slik:
Teacher_ID | Lærernavn | Kurs |
---|---|---|
Teacher_001 | Carmen | Biologi |
Teacher_002 | Veronica | Matte |
Teacher_003 | Jorge | Engelsk |
Hva om Carmen lærer to eller flere kurs? Vi har to alternativer med denne designen. Vi kan bare legge den til Carmens eksisterende rekord, slik:
Teacher_ID | Lærer_Navn | Kurs |
---|---|---|
Teacher_001 | Carmen | Biologi, matematikk |
Teacher_002 | Veronica | Matte |
Teacher_003 | Jorge | Engelsk |
Utformingen ovenfor er imidlertid ufleksibel og kan føre til problemer senere når du prøver å sette inn, redigere eller slette data.
Det gjør det vanskelig å søke etter data. Denne konstruksjonen bryter med det første prinsippet om database normalisering, First Normal Form (1NF), som sier at hver tabellcell skal inneholde et enkelt, diskret datatykke.
Et annet designalternativ kan være å bare legge til en ny rekord for Carmen:
Lærer_id | Lærer_Navn | Kurs |
---|---|---|
Teacher_001 | Carmen | Biologi |
Teacher_001 | Carmen | Matte |
Teacher_002 | Veronica | Matte |
Teacher_003 | Jorge | Engelsk |
Dette overholder 1NF, men er fortsatt dårlig databasedesign fordi den introduserer redundans og kan oppblåse en veldig stor database unødvendig. Enda viktigere, dataene kan bli inkonsekvente. For eksempel, hva om Carmens navn endret seg? Noen som jobber med dataene, kan oppdatere navnet sitt i en post og mislykkes i å oppdatere den i den andre posten. Denne utformingen bryter med Second Normal Form (2NF), som overholder 1NF, og må også unngå redundans av flere poster ved å skille delmengder av data inn i flere tabeller og skape et forhold mellom dem.
Hvordan lage en database med en-til-mange relasjoner
For å implementere en til mange forhold i Lærer og kurs-bordet, bryter vi tabellene inn i to og knytter dem sammen med en fremmednøkkel.
Her har vi fjernet kurskolonnen i lærerbordet:
Lærer_id | Lærer_Navn |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Og her er kursbordet. Merk at den utenlandske nøkkelen, Teacher_ID, kobler et kurs til en lærer i lærerbordet:
Course_ID | COURSE_NAME | Teacher_ID |
---|---|---|
Course_001 | Biologi | Teacher_001 |
Course_002 | Matte | Teacher_001 |
Course_003 | Engelsk | Teacher_003 |
Vi har utviklet et forhold mellom lærer og kursbord ved hjelp av en utenlandsk nøkkel.
Dette forteller oss at både biologi og matematikk er undervist av Carmen og at Jorge lærer engelsk.
Vi kan se hvordan dette designet unngår eventuelle redundanser, gjør det mulig for enkelte lærere å lære flere kurs, og implementerer en til mange forhold.
Databaser kan også implementere et ett-til-ett-forhold og et mange til mange forhold.