Skip to content

En-till-många-förhållanden i en databas

30 de juni de 2021
GettyImages 580501819 5a42885398020700379981c8 32f7898ca3ed408389d3d2c6deb4bc41

En en-till-relation i en databas inträffar när varje post i tabell A kan ha många länkade poster i tabell B, men varje post i tabell B kan endast ha en motsvarande post i tabell A. En en-till-många-relation i en databas är den vanligaste relationsdatabasdesignen och är kärnan i bra design. Databaser kan också implementera en en-till-en-relation och en många-till-många-relation.

 

Exempel på en en-till-många relation

Tänk på förhållandet mellan en lärare och de kurser de undervisar. En lärare kan undervisa flera klasser, men kursen skulle inte ha samma relation med läraren. Därför kan det finnas många poster i tabellen Kurser för varje post i en lärartabell. Detta exempel illustrerar en en-till-många relation: en lärare till flera kurser.

 

Varför det är viktigt att etablera en en-till-många-relation

För att representera en en-till-många relation behöver du minst två tabeller. Låt oss se varför.

Efterlevnad av den första normala formdesignen

Kanske skapade vi en tabell där vi vill registrera namn och kurser som undervisats. Vi kan utforma en tabell för lärare och kurser så här:

Lärare_ID Lärarnamn Kurs
Lärare_001 Carmen Biologi
Lärare_002 Veronica Matematik
Lärare_003 Jorge engelsk

Vad händer om Carmen undervisar i två eller flera kurser? Vi har två alternativ med denna design. Vi kan lägga till det i Carmens befintliga skiva, så här:

Lärare_ID Lärare_Namn Kurs
Lärare_001 Carmen Biologi, matematik
Lärare_002 Veronica Matematik
Lärare_003 Jorge engelsk

Designen ovan är dock oflexibel och kan leda till problem senare när du infogar, redigerar eller tar bort data. Det gör det svårt att söka efter data. Denna design bryter också mot den första principen för databasnormalisering, First Normal Form (1NF), som säger att varje tabellcell ska innehålla en enda, diskret bit data.

Den andra normala formregeln

Ett annat designalternativ kan vara att lägga till en andra skiva för Carmen:

Lärare_ID Lärare_Namn Kurs
Lärare_001 Carmen Biologi
Lärare_001 Carmen Matematik
Lärare_002 Veronica Matematik
Lärare_003 Jorge engelsk

Detta tillvägagångssätt följer 1NF men är fortfarande dålig databasdesign eftersom det introducerar redundans och kan spränga en stor databas i onödan. Ännu viktigare, uppgifterna kan bli inkonsekventa. Till exempel, om Carmens namn ändras? Någon som arbetar med data kan uppdatera hennes namn i en post och misslyckas med att uppdatera det i den andra posten. Denna design bryter mot standarden Second Normal Form (2NF), som följer 1NF och måste också undvika uppsägningar av flera poster. 2NF-regeln uppnår detta genom att separera delmängder av data i flera tabeller och skapa en relation mellan dem.

 

Hur man utformar en databas med en-till-många-relationer

För att implementera en-till-många-relation i tabellen Lärare och kurser, dela upp tabellerna i två och länka dem med en främmande nyckel. Här tog vi bort kurskolumnen i lärartabellen:

Lärare_ID Lärare_Namn
Lärare_001 Carmen
Lärare_002 Veronica
Lärare_003 Jorge

Och här är tabellen Kurser. Observera att dess främmande nyckel, Teacher_ID, länkar en kurs till en lärare i tabellen Teachers:

Kurs_ID Kursnamn Lärare_ID
Kurs_001 Biologi Lärare_001
Kurs_002 Matematik Lärare_001
Kurs_003 engelsk Lärare_003

Vi har utvecklat en relation mellan lärarna och tabellen Kurser med hjälp av en främmande nyckel. Detta arrangemang berättar för oss att Carmen undervisar i både biologi och matematik och att Jorge undervisar engelska. Vi kan se hur denna design undviker eventuella uppsägningar, gör det möjligt för enskilda lärare att undervisa flera kurser och implementera en en-till-många-relation.