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

Collegamento di una terza tabella a una tabella bridge in un'associazione molti a molti

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