Mysql
 sql >> Base de données >  >> RDS >> Mysql

Liaison d'une troisième table à une table de pont dans une association plusieurs à plusieurs

+1 pour Matt Fenwick. J'ajouterais que vous voulez être un peu prudent avec vos contraintes de clé étrangère. Vous avez essentiellement deux options, qui pourraient toutes deux se ressembler, selon votre choix de clés primaires.

Première option est :Oubliez la simple intersection entre TEACHER et INSTRUMENT et remplacez-le par une intersection complexe qui inclut teacher_id , instrument_id et level_id . Ces trois colonnes seraient la clé primaire (composée) de cette table d'intersection. Dans cette option, vous avez des contraintes de clé étrangère définies sur teacher_id et instrument_id (et level_id s'il s'agit en fait d'une clé étrangère vers un LEVEL table et pas seulement un entier ou une chaîne de code).

Option 2 est :Conservez l'intersection simple entre TEACHER et INSTRUMENT (appelons-le TEACHER_INSTRUMENT même si ce n'est pas imaginatif) et ajoutez un tableau sous-enfant qui définit les niveaux qui peuvent être enseignés. Cette table sous-enfant (appelons-la SKILL ) a un level_id et une clé étrangère vers TEACHER_INSTRUMENT . Si la clé primaire de TEACHER_INSTRUMENT est la combinaison de teacher_id et instrument_id puis le SKILL table va avoir les mêmes trois colonnes que dans la première option. Qu'est-ce qui rend cette option différente ? La contrainte de clé étrangère de SKILL doit être à la table d'intersection, pas à TEACHER et INSTRUMENT .

Pourquoi est-ce important ? Si vous choisissez la première option, vous devrez peut-être disposer d'une logique de requête supplémentaire pour obtenir une grille de compétences entièrement remplie, car il n'y a aucune contrainte d'intégrité référentielle que vous pouvez définir qui garantira que tous les niveaux de compétence sont renseignés pour chaque combinaison enseignant/instrument.

D'un autre côté, si vous choisissez la deuxième option, vous avez l'avantage de séparer les préoccupations entre qui peut utiliser quoi et dans quelle mesure ils peuvent l'enseigner.

Ce que vous voulez éviter, c'est d'avoir une table qui contient uniquement la relation enseignant/instrument, puis une seconde qui répète (indépendamment) cette relation mais ajoute le détail du niveau de compétence. Si vous faites cela, vous courez le risque que ces deux éléments ne soient pas synchronisés.