sql >> Database teknologi >  >> RDS >> Mysql

At knytte et tredje bord til et bridgebord i en mange til mange forening

+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.



  1. Bruger utf8mb4 med php og mysql

  2. Hvordan bruger jeg variabler i Oracle SQL Developer?

  3. Sådan sender du flere variabler til PHP med jQuery

  4. Sådan udskiftes en mellemliggende MySQL- eller MariaDB-master med en Binlog-server ved hjælp af MaxScale