+1 for Matt Fenwick. Jeg vil tilføje, at du gerne vil være lidt forsigtig med dine begrænsninger for fremmednøgle. Du har grundlæggende to muligheder, som begge kan ende med at se ret ens ud, afhængigt af dit valg af primære nøgler.
Mulighed 1 er:Glem det simple skæringspunkt mellem TEACHER
og INSTRUMENT
og erstatte det med et komplekst skæringspunkt, der inkluderer teacher_id
, instrument_id
og level_id
. Alle tre af disse kolonner ville være den (sammensatte) primære nøgle i denne skæringstabel. I denne mulighed har du begrænsninger for fremmednøgle defineret på teacher_id
og instrument_id
(og level_id
hvis dette faktisk er en fremmednøgle til en LEVEL
tabel og ikke kun et heltal eller en strengkode).
Mulighed to er:Hold det simple skæringspunkt mellem TEACHER
og INSTRUMENT
(lad os kalde det TEACHER_INSTRUMENT
selvom det er fantasiløst), og tilføj en underordnet tabel, der definerer de niveauer, der kan undervises. Denne underordnede tabel (lad os kalde den SKILL
) har et level_id
og en fremmednøgle til TEACHER_INSTRUMENT
. Hvis den primære nøgle til TEACHER_INSTRUMENT
er kombinationen af teacher_id
og instrument_id
derefter SKILL
tabellen vil have de samme tre kolonner som i mulighed 1. Hvad gør denne mulighed anderledes? Den fremmede nøgle-begrænsning fra SKILL
skal være til skæringstabellen, ikke til TEACHER
og INSTRUMENT
.
Hvorfor er dette vigtigt? Hvis du vælger mulighed 1, skal du muligvis have noget ekstra forespørgselslogik for at få et fuldt udfyldt gitter af færdigheder, da der ikke er nogen referenceintegritetsbegrænsning, du kan definere, som vil sikre, at alle færdighedsniveauer er udfyldt for hver lærer/instrumentkombination.
På den anden side, hvis du vælger mulighed to, har du fordelen af adskillelse af bekymringer mellem, hvem der kan bruge hvad, og hvor godt de kan lære det.
Det, du vil undgå, er at have én tabel, der kun indeholder lærer/instrument-relationen og derefter en anden, som (uafhængigt) gentager denne relation, men tilføjer færdighedsniveaudetaljerne. Hvis du gør det, risikerer du, at disse to ting bliver ude af sync.