+1 per Matt Fenwick. Aggiungo che vuoi stare un po 'attento con i tuoi vincoli di chiave esterna. In sostanza hai due opzioni, entrambe potrebbero sembrare abbastanza simili, a seconda della tua scelta di chiavi primarie.
Opzione uno è:Dimentica la semplice intersezione tra TEACHER
e INSTRUMENT
e sostituiscilo con un'intersezione complessa che includa teacher_id
, instrument_id
e level_id
. Tutte e tre queste colonne sarebbero la chiave primaria (composta) di questa tabella di intersezione. In questa opzione, hai i vincoli di chiave esterna definiti su teacher_id
e instrument_id
(e level_id
se questa è effettivamente una chiave esterna a un LEVEL
tabella e non solo un codice intero o stringa).
Opzione due è:Mantieni la semplice intersezione tra TEACHER
e INSTRUMENT
(chiamiamolo TEACHER_INSTRUMENT
anche se è privo di fantasia) e aggiungi una tabella secondaria che definisce i livelli che possono essere insegnati. Questa tabella secondaria (chiamiamola SKILL
) ha un level_id
e una chiave esterna per TEACHER_INSTRUMENT
. Se la chiave primaria di TEACHER_INSTRUMENT
è la combinazione di teacher_id
e instrument_id
quindi il SKILL
la tabella avrà le stesse tre colonne dell'opzione uno. Cosa rende diversa questa opzione? Il vincolo della chiave esterna da SKILL
deve essere nella tabella delle intersezioni, non per TEACHER
e INSTRUMENT
.
Perché è importante? Se si sceglie l'opzione uno, potrebbe essere necessario disporre di una logica di query aggiuntiva per ottenere una griglia di abilità completamente popolata, poiché non esiste alcun vincolo di integrità referenziale che è possibile definire che assicurerà che tutti i livelli di abilità siano popolati per ciascuna combinazione insegnante/strumento.
D'altra parte, se scegli l'opzione due, hai il vantaggio di separare le preoccupazioni tra chi può usare cosa e quanto bene può insegnarlo.
Quello che vuoi evitare è avere una tabella che contiene solo la relazione insegnante/strumento e poi una seconda che (indipendentemente) ripete quella relazione ma aggiunge i dettagli del livello di abilità. Se lo fai, corri il rischio che queste due cose non siano sincronizzate.