+1 voor Matt Fenwick. Ik zou hieraan willen toevoegen dat u een beetje voorzichtig wilt zijn met uw externe sleutelbeperkingen. Je hebt in wezen twee opties, die beide behoorlijk op elkaar kunnen lijken, afhankelijk van je keuze voor primaire sleutels.
Optie één is:Vergeet de eenvoudige kruising tussen TEACHER
en INSTRUMENT
en vervang het door een complex kruispunt dat teacher_id
. bevat , instrument_id
en level_id
. Alle drie deze kolommen zouden de (samengestelde) primaire sleutel van deze intersectietabel zijn. In deze optie heeft u beperkingen voor externe sleutels gedefinieerd op teacher_id
en instrument_id
(en level_id
als dit daadwerkelijk een externe sleutel is voor een LEVEL
tabel en niet alleen een geheel getal of tekenreekscode).
Optie twee is:Houd de eenvoudige kruising tussen TEACHER
en INSTRUMENT
(laten we het TEACHER_INSTRUMENT
noemen ook al is dat fantasieloos) en voeg een sub-kindtabel toe die de niveaus definieert die kunnen worden onderwezen. Deze sub-kindtabel (laten we het SKILL
noemen) ) heeft een level_id
en een externe sleutel naar TEACHER_INSTRUMENT
. Als de primaire sleutel van TEACHER_INSTRUMENT
is de combinatie van teacher_id
en instrument_id
dan de SKILL
tabel krijgt dezelfde drie kolommen als in optie één. Wat maakt deze optie anders? De externe sleutelbeperking van SKILL
moet naar de intersectietabel zijn, niet naar TEACHER
en INSTRUMENT
.
Waarom is dit belangrijk? Als u optie één kiest, heeft u mogelijk wat extra zoeklogica nodig om een volledig gevuld raster van vaardigheden te krijgen, aangezien er geen referentiële integriteitsbeperking is die u kunt definiëren om ervoor te zorgen dat alle vaardigheidsniveaus worden ingevuld voor elke combinatie van leraar/instrument.
Aan de andere kant, als u optie twee kiest, heeft u het voordeel dat de zorgen worden gescheiden tussen wie wat kan gebruiken en hoe goed ze het kunnen aanleren.
Wat je wilt vermijden, is dat je één tabel hebt die alleen de relatie leraar/instrument bevat en vervolgens een tweede die (onafhankelijk) die relatie herhaalt, maar het detail van het vaardigheidsniveau toevoegt. Als je dat doet, loop je het risico dat deze twee dingen niet synchroon lopen.