2013-02-16 9 views
6

Wyobraź sobie, że mam trzy tabele o nazwach profiles, profiles_skills i skills. Jest to relacja HABTM, w której profil może mieć wiele umiejętności, a umiejętność może należeć do wielu profili.Podczas dodawania ograniczenia klucza obcego, który kierunek jest najlepszą praktyką?

Potrzebuję ustawić ograniczenie klucza obcego między tymi tabelami. Moje pytanie brzmi, w jakim kierunku powinien być klucz obcy? Na przykład, czy mogę to zrobić:

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

Czy mogę to zrobić:

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

Nigdy naprawdę zastosowaną konwencję, po prostu zrobić to tak, wpisuję go i nie miał problem. Ale zawsze zastanawiałem się nad tym, czy to naprawdę ma znaczenie.

+2

Obce klucze muszą znajdować się na "dziecięcym" stole, który w twoim przypadku to 'profiles_skills'. I tak, to ma znaczenie. z FK na osobnych tabelach profili/umiejętności, usunięcie umiejętności z profilu spowoduje usunięcie profilu. –

+0

Trudno sobie wyobrazić przypadek użycia, gdy niemożliwe jest posiadanie rekordu w tabeli 'profiles' (i/lub' skills'), która NIE zawiera odpowiedniego wiersza w tabeli 'profiles_skills'. Ale to właśnie zapobiega twoja druga definicja. Dlatego nie jest to kwestia "najlepszych praktyk" - pierwszy sposób to jedyny sposób. – raina77ow

Odpowiedz

9

Moje pytanie brzmi, w którym kierunku powinien być klucz obcy?

klucze obce powinny być w przyłączeniowej tabeli (profiles_skills), odnosząc się do końcowych tabel (profiles i skills).

Jeśli spróbujesz zrobić to na odwrót, będziesz w stanie "połączyć" nieistniejący profil i/lub umiejętność, która jest dokładnie tym, czemu klucze obce mają zapobiegać. Uniemożliwiłoby to także uzyskanie niezwiązanego profilu (lub umiejętności).

Powiązane problemy