+1 para Matt Fenwick. Agregaría que desea tener un poco de cuidado con sus restricciones de clave externa. Básicamente, tiene dos opciones, las cuales podrían terminar pareciendo bastante similares, dependiendo de su elección de claves principales.
Opción uno es:Olvídate de la simple intersección entre TEACHER
y INSTRUMENT
y reemplácelo con una intersección compleja que incluya teacher_id
, instrument_id
y level_id
. Las tres columnas serían la clave principal (compuesta) de esta tabla de intersección. En esta opción, tiene restricciones de clave externa definidas en teacher_id
y instrument_id
(y level_id
si esto es en realidad una clave externa a un LEVEL
tabla y no solo un número entero o código de cadena).
Opción dos es:Mantener la intersección simple entre TEACHER
y INSTRUMENT
(Llamémoslo TEACHER_INSTRUMENT
aunque eso no es imaginativo) y agregue una tabla secundaria que defina los niveles que se pueden enseñar. Esta tabla secundaria (llamémosla SKILL
) tiene un level_id
y una clave externa a TEACHER_INSTRUMENT
. Si la clave principal de TEACHER_INSTRUMENT
es la combinación de teacher_id
y instrument_id
luego la SKILL
la tabla tendrá las mismas tres columnas que en la opción uno. ¿Qué hace diferente a esta opción? La restricción de clave externa de SKILL
debe ser a la mesa de intersección, no a TEACHER
y INSTRUMENT
.
¿Por qué es esto importante? Si elige la opción uno, es posible que deba tener alguna lógica de consulta adicional para obtener una cuadrícula de habilidades completa, ya que no hay una restricción de integridad referencial que pueda definir que garantice que todos los niveles de habilidad se completen para cada combinación de maestro/instrumento.
Por otro lado, si elige la opción dos, tiene la ventaja de la separación de preocupaciones entre quién puede usar qué y qué tan bien puede enseñarlo.
Lo que desea evitar es tener una tabla que contenga solo la relación maestro/instrumento y luego una segunda que (independientemente) repite esa relación pero agrega el detalle del nivel de habilidad. Si hace eso, corre el riesgo de que estas dos cosas no estén sincronizadas.