Et forhold etableres mellom to databasetabeller når en tabell bruker en fremmednøkkel som refererer til primærnøkkelen til en annen tabell. Dette er det grunnleggende konseptet bak begrepet relasjonsdatabase.
Hvordan en utenlandsk nøkkel fungerer for å etablere et forhold
En primærnøkkel identifiserer hver post i tabellen unikt. Det er en type kandidatnøkkel som vanligvis er den første kolonnen i en tabell og kan genereres automatisk av databasen for å sikre at den er unik. En fremmednøkkel er en annen kandidatnøkkel (ikke primærnøkkelen) som brukes til å koble en post til data i en annen tabell.
Tenk for eksempel på disse to tabellene som identifiserer hvilken lærer som underviser i hvilket kurs. Her er kurstabellens primærnøkkel Course_ID. Dens fremmednøkkel er Teacher_ID:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biology | Teacher_001 |
Course_002 | Math | Teacher_002 |
Course_003 | engelsk | Teacher_003 |
Du kan se at fremmednøkkelen i Courses samsvarer med en primærnøkkel i Teachers:
Teacher_ID | Teacher_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Vi kan si at fremmednøkkelen Teacher_ID bidro til å etablere et forhold mellom kurs- og lærertabellene.
Typer av databaserelasjoner
Ved å bruke fremmednøkler, eller andre kandidatnøkler, kan du implementere tre typer relasjoner mellom tabeller:
En-til-en
Denne typen relasjoner tillater bare én post på hver side av relasjonen. Primærnøkkelen gjelder bare én post (eller ingen) i en annen tabell. For eksempel, i et ekteskap har hver ektefelle bare én annen ektefelle. Denne typen relasjoner kan implementeres i en enkelt tabell og bruker derfor ikke en fremmednøkkel.
En-til-mange
Et en-til-mange-forhold gjør at en enkelt post i en tabell kan relateres til flere poster i en annen tabell. Vurder en bedrift med en database som har kunde- og ordretabeller.
En enkelt kunde kan kjøpe flere bestillinger, men en enkelt bestilling kunne ikke knyttes til flere kunder. Derfor vil ordretabellen inneholde en fremmednøkkel som samsvarer med primærnøkkelen til Kunder-tabellen, mens Kunder-tabellen ikke har noen fremmednøkkel som peker til Ordretabellen.
Many-to-Many
Dette er et komplekst forhold der mange poster i en tabell kan kobles til mange poster i en annen tabell. For eksempel trenger bedriften vår sannsynligvis kunde- og ordretabeller, og trenger sannsynligvis også en produkttabell.
Igjen, forholdet mellom Kunder og Bestillinger-tabellen er én-til-mange, men vurder forholdet mellom Bestillinger og Produkter-tabellen. En bestilling kan inneholde flere produkter, og et produkt kan være knyttet til flere bestillinger siden flere kunder kan sende inn en bestilling som inneholder noen av de samme produktene. Denne typen relasjoner krever minst tre tabeller.
Hvorfor er databaserelasjoner viktige?
Etablering av konsistente relasjoner mellom databasetabeller bidrar til å sikre dataintegritet, og bidrar til databasenormalisering. For eksempel, hva om vi ikke koblet noen tabeller gjennom en fremmednøkkel og i stedet kombinerte dataene i kurs- og lærertabellene, slik:
Teacher_ID | Teacher_Name | kurs |
---|---|---|
Teacher_001 | Carmen | Biologi, matematikk |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Denne utformingen er lite fleksibel og bryter med det første prinsippet for databasenormalisering, First Normal Form, som sier at hver tabellcelle skal inneholde et enkelt, diskret stykke data.
Eller kanskje vi bestemte oss for å legge til en ny rekord for Carmen, for å håndheve 1NF:
Teacher_ID | Teacher_Name | kurs |
---|---|---|
Teacher_001 | Carmen | Biology |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Dette er fortsatt et svakt design, som introduserer unødvendig duplisering og det som kalles datainnsettingsavvik, noe som betyr at det kan bidra til inkonsistente data. For eksempel, hvis en lærer har flere poster, hva om noen data må redigeres, men personen som utfører dataredigeringen ikke innser at det finnes flere poster? Tabellen vil da inneholde forskjellige data for samme individ, uten noen klar måte å identifisere eller unngå det på.
Å bryte denne tabellen i to tabeller, lærere og kurs, skaper det riktige forholdet mellom dataene og bidrar derfor til å sikre datakonsistens og nøyaktighet.