2013-02-16 13 views
6

Immagina di avere tre tabelle chiamate profiles, profiles_skills e skills. È una relazione HABTM, in cui un profilo può avere molte competenze e un'abilità può appartenere a molti profili.Quando si aggiunge un vincolo di chiave esterna, quale direzione è la migliore pratica?

Ho bisogno di impostare un vincolo di chiave esterna tra queste tabelle. La mia domanda è, quale direzione dovrebbe essere la chiave straniera? Ad esempio, posso fare questo:

ALTER TABLE profiles_skills ADD FOREIGN KEY (skill_id) REFERENCES skills(id); 
ALTER TABLE profiles_skills ADD FOREIGN KEY (profile_id) REFERENCES profiles(id); 

O faccio a fare questo:

ALTER TABLE profiles ADD FOREIGN KEY (id) REFERENCES profiles_skills(profile_id); 
ALTER TABLE skills ADD FOREIGN KEY (id) REFERENCES profiles_skills(skill_id); 

Non ho mai seguito un convegno, faccio solo il mio modo di scrivere e non hanno ha avuto un problema Ma mi sono sempre chiesto nel profondo della mia mente se anche ciò conta davvero.

+2

Le chiavi esterne devono essere sulla tabella "figlio", che nel tuo caso è 'profiles_skills'. E sì, conta. con gli FK nelle tabelle profili/abilità separate, la rimozione di un'abilità da un profilo eliminerebbe il profilo. –

+0

È difficile immaginare un caso d'uso quando è impossibile avere un record nella tabella 'profiles' (e/o' skills') che NON ha una riga corrispondente nella tabella 'profiles_skills'. Ma questo è esattamente ciò che la tua seconda definizione impedisce. Pertanto, non è una questione di "buone pratiche" - il primo modo è l'unico modo. – raina77ow

risposta

9

La mia domanda è, quale direzione dovrebbe essere la chiave esterna?

chiavi esterne dovrebbero essere nella giunzione tavolo (profiles_skills), facendo riferimento alle endpoint tavoli (profiles e skills).

Se provate a farlo viceversa, sarete in grado di "connettere" il profilo inesistente e/o l'abilità, che è esattamente ciò che le chiavi esterne dovrebbero impedire. Inoltre, renderebbe impossibile avere un profilo (o abilità) non connesso.

Problemi correlati