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