Der etableres et forhold mellem to databasetabeller, når en tabel bruger en fremmednøgle, der refererer til den primære nøgle i en anden tabel. Dette er det grundlæggende koncept bag begrebet relationel database.
Hvordan en fremmednøgle fungerer for at etablere et forhold
En primær nøgle identificerer entydigt hver post i tabellen. Det er en type kandidatnøgle, der norm alt er den første kolonne i en tabel, og som automatisk kan genereres af databasen for at sikre, at den er unik. En fremmednøgle er en anden kandidatnøgle (ikke den primære nøgle), der bruges til at linke en post til data i en anden tabel.
Tænk for eksempel på disse to tabeller, der identificerer, hvilken lærer der underviser i hvilket kursus. Her er kurser-tabellens primære nøgle Course_ID. Dens fremmednøgle er Teacher_ID:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | Biologi | Teacher_001 |
Course_002 | Math | Teacher_002 |
Course_003 | engelsk | Teacher_003 |
Du kan se, at fremmednøglen i Courses matcher en primær nøgle i Teachers:
Teacher_ID | Teacher_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronica |
Teacher_003 | Jorge |
Vi kan sige, at fremmednøglen Teacher_ID hjalp med at etablere et forhold mellem kurserne og lærertabellerne.
Typer af databaserelationer
Ved at bruge fremmednøgler eller andre kandidatnøgler kan du implementere tre typer relationer mellem tabeller:
En-til-en
Denne type relation tillader kun én post på hver side af forholdet. Den primære nøgle vedrører kun én post (eller ingen) i en anden tabel. For eksempel har hver ægtefælle i et ægteskab kun én anden ægtefælle. Denne form for relation kan implementeres i en enkelt tabel og bruger derfor ikke en fremmednøgle.
En-til-mange
En en-til-mange-relation gør det muligt for en enkelt post i en tabel at blive relateret til flere poster i en anden tabel. Overvej en virksomhed med en database, der har kunde- og ordretabeller.
En enkelt kunde kan købe flere ordrer, men en enkelt ordre kunne ikke knyttes til flere kunder. Ordrer-tabellen ville derfor indeholde en fremmednøgle, der matchede den primære nøgle i Kunder-tabellen, mens Kunder-tabellen ikke ville have nogen fremmednøgle, der peger på Ordre-tabellen.
Mange-til-mange
Dette er et komplekst forhold, hvor mange poster i en tabel kan linke til mange poster i en anden tabel. For eksempel har vores virksomhed sandsynligvis brug for kunde- og ordretabeller og har sandsynligvis også brug for en produkttabel.
Igen er forholdet mellem Kunder og Ordrer-tabellen én-til-mange, men overvej forholdet mellem Ordrer og Produkter-tabellen. En ordre kan indeholde flere produkter, og et produkt kan være knyttet til flere ordrer, da flere kunder kan afgive en ordre, der indeholder nogle af de samme produkter. Denne form for relation kræver som minimum tre borde.
Hvorfor er databaserelationer vigtige?
Etablering af konsistente relationer mellem databasetabeller hjælper med at sikre dataintegritet, hvilket bidrager til databasenormalisering. For eksempel, hvad nu hvis vi ikke linkede nogen tabeller gennem en fremmednøgle og i stedet kombinerede dataene i kurser- og lærertabellerne, som sådan:
Teacher_ID | Teacher_Name | Kursus |
---|---|---|
Teacher_001 | Carmen | Biologi, matematik |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Dette design er ufleksibelt og overtræder det første princip for databasenormalisering, First Normal Form, som siger, at hver tabelcelle skal indeholde et enkelt, diskret stykke data.
Eller måske besluttede vi at tilføje en anden rekord for Carmen for at håndhæve 1NF:
Teacher_ID | Teacher_Name | Kursus |
---|---|---|
Teacher_001 | Carmen | Biologi |
Teacher_001 | Carmen | Math |
Teacher_002 | Veronica | Math |
Teacher_003 | Jorge | engelsk |
Dette er stadig et svagt design, der introducerer unødvendig duplikering og det, der kaldes dataindsættelsesanomalier, hvilket betyder, at det kan bidrage til inkonsistente data. For eksempel, hvis en lærer har flere poster, hvad nu hvis nogle data skal redigeres, men den person, der udfører dataredigeringen, er ikke klar over, at der findes flere poster? Tabellen ville så indeholde forskellige data for den samme person uden nogen klar måde at identificere eller undgå dem på.
At opdele denne tabel i to tabeller, Lærere og Kurser, skaber det korrekte forhold mellem dataene og hjælper derfor med at sikre datakonsistens og nøjagtighed.