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

Unione complessa MySQL

Se la gerarchia desiderata è programma -> tema -> strand -> anno -> unità -> learning_event, allora dovresti modificare la struttura della tua tabella per riflettere questo. In particolare, il tema dovrebbe avere una relazione di chiave esterna tra tema e programma e avrai bisogno di un livello extra per l'anno. Avere una chiave esterna tra tema e programma evita la necessità di un collegamento incrociato. I cross join hanno l'abitudine di morderti e sono generalmente da evitare.

Se guardi questo db fiddle vedrai che ho apportato queste modifiche. Ho chiamato il livello dell'anno strandyear per evitare di usare una parola riservata, ma l'intenzione dovrebbe essere chiara. Ora i join diventano inner join (anziché left join) per raccogliere i valori della descrizione dai livelli più alti nell'albero e il livello inferiore (learning_events) contiene automaticamente solo i valori che corrispondono a strand, year e unit, per nessun altro motivo che che la struttura stessa lo garantisce, attraverso il semplice espediente che ogni livello ha una chiave esterna al livello superiore.

Si noti che le chiavi esterne in modo efficace si collegano a catena. Non è necessaria, ad esempio, una chiave esterna specifica tra learning_event e strand, perché le chiavi intermedie nella catena garantiscono la relazione.