2013-02-16 52 views
6

想象我有三個表稱爲profilesprofiles_skillsskills。這是一個HABTM關係,一個配置文件可以擁有許多技能,而且一項技能可以屬於多個配置文件。當增加一個外鍵約束,哪個方向的最佳實踐?

我需要建立這些表之間的外鍵約束。我的問題是,外鍵應該是什麼方向?例如,做我這樣做:

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

還是我這樣做:

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

我從來沒有真正遵循慣例,我只是做了我輸入並沒有路有問題。但是我一直想知道它是否真的很重要。

+2

的外鍵必須在「子」表,而你的情況是'profiles_skills'。是的,這很重要。通過單獨的配置文件/技能表上的FK,從配置文件中刪除技能將刪除配置文件。 – 2013-02-16 23:32:28

+0

這是很難想象的使用情況時,它不可能在'profiles'記錄(和/或'skills')表中沒有的'profiles_skills'表中的相應行。但這正是你的第二個定義所預防的。因此,這不是「最佳實踐」的問題 - 第一種方法是唯一的方法。 – raina77ow 2013-02-16 23:57:25

回答

9

我的問題是,如果外鍵是什麼方向?

外鍵應該是在表(profiles_skills),引用端點表(profilesskills)。

如果您嘗試以相反方式執行此操作,您將能夠「連接」不存在的配置文件和/或技能,這正是外鍵應該防止的。這也會導致無法建立無關聯的配置文件(或技能)。