sql >> Database >  >> RDS >> Mysql

Een derde tafel koppelen aan een overbruggingstafel in een veel-naar-veel associatie

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



  1. Fout:Geen module met de naam psycopg2.extensions

  2. Docker Machine op Mac:Kan de gekoppelde volumes niet zien op de docker-host/docker-machine? Waar worden volumes fysiek opgeslagen?

  3. Hoe bereken je de procentuele stijging van de vorige rij/dag na complexe Group By?

  4. Een speciale opgeslagen procedure om de nieuwste status van databaseback-ups te krijgen