Mysql 添加外键约束时,最佳做法是哪个方向?

Mysql 添加外键约束时,最佳做法是哪个方向?,mysql,database,database-design,relational-database,Mysql,Database,Database Design,Relational Database,假设我有三个表,分别是profiles、profiles\u skills和skills。这是一个HABTM关系,其中一个配置文件可以有许多技能,一个技能可以属于许多配置文件 我需要在这些表之间设置外键约束。我的问题是,外键应该是什么方向?例如,我是否这样做: ALTER TABLE profiles_skills ADD FOREIGN KEY (skill_id) REFERENCES skills(id); ALTER TABLE profiles_skills ADD FOREIGN K

假设我有三个表,分别是
profiles
profiles\u skills
skills
。这是一个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);
或者我应该这样做:

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);
我从来没有真正遵守过惯例,我只是按照我打字的方式来做,没有遇到任何问题。但我一直在想,这是否真的很重要

我的问题是,外键应该是什么方向

外键应位于连接表(
profiles\u skills
)中,引用端点表(
profiles
skills


如果您尝试以另一种方式进行操作,您将能够“连接”不存在的配置文件和/或技能,这正是外键应该防止的。这也使得不可能有一个未连接的配置文件(或技能)。

外键必须在“child”表上,在您的情况下是
profiles\u skills
。是的,这很重要。如果FK位于单独的配置文件/技能表上,则从配置文件中删除技能将删除该配置文件。很难想象在
配置文件
(和/或
技能
)表中不可能有记录,而
配置文件(技能
表中没有相应的行。但这正是你的第二个定义所阻止的。因此,这不是“最佳实践”的问题——第一种方法是唯一的方法。