Makine是一个复合外键,指的是两个不同的表

时间:2017-11-11 08:40:36

标签: mysql sql

我正在为医院数据库制作架构。我有4个表,候选人详细信息,医院详细信息,职位详细信息和面试详情。面试表有一个外键引用候选表,一个到位置表,我也希望它有一个引用医院表但我注意到有可能那么有一个元组,其中位置id的组合并且医院ID与位置表上发生的组合不同(位置表具有指向医院表的外键)因此换句话说,可以输入不正确的医院ID或位置ID。面试表。因此,例如在面试表上,我可以输入位置ID为01且医院ID为02的元组,但如果您进入位置表,则正在被评审的位置ID可能很容易具有不同的医院ID(例如03)。

我当时认为可能不会创建一个同时引用两个不同表的复合外键。如果不是这样,是解决问题的唯一方法,只需从访谈表中删除医院ID栏吗?

我一直在使用mySQL工作台,因此我手边没有任何SQL代码,但如果需要任何额外信息(例如ERR图像)来回答这个问题,我会尽力采购它。< / p>

2 个答案:

答案 0 :(得分:0)

简答: ,外键约束始终引用一个父表。

但是,如果我理解你的情况,你就有4张桌子

candidate details. id
hospital details. id
position details. id, hospital_id
interview details. candidate_id, hospital_id, position_id

问题是位置和医院之间的关系是多对多

简单方法EAV 添加另一个表名为hospital_postition,其中包含所有医院的所有职位,然后将每个hospital_postition链接到面试中的condidate

candidate details. id
hospital details. id
position details. id
hospital_postition. id, hospital_id, position_id
interview details. candidate_id, hospital_position_id

答案 1 :(得分:0)

少即是多了!

您遇到此问题,因为该表格不是第3范式。 hospital_id不依赖于访谈,它取决于位置,而position_id不是此能力的关键。

问问自己,我真的想在面试表中记录hospital_id吗?您可能需要的所有信息都已存储在职位表中。我想到这个专栏的唯一原因就是你在医院进行面试的地方,而不是职位所在的医院。如果是这种情况,那么您的架构已经正确,但您的问题则另有说明。

从面试表中删除hospital_id列,您的问题将神奇地消失。

关于从MySQL Workbench获取表定义(SQL代码)的主题,请尝试以下方法:

  • 右键单击架构浏览器中的表名称
  • 选择&#34;发送给SQL编辑器&#34;
  • 选择&#34;创建声明&#34;