2017-11-11 51 views
0

我正在为医院数据库制定一个模式。我有4个表格,候选人详细信息,医院详细信息,职位详情和面试详情。面试表有一个外键指的候选人表,一个到位置的表,我也希望它有一个指的是医院表,但我注意到有可能有一个元组,其中位置ID的组合并且医院ID与位置表上发生的组合不同(位置表具有涉及医院表的外键)。换句话说,可以在医院中输入不正确的医院ID或位置ID采访表。因此,例如在采访表上,我可以输入一个元组,其中职位ID是01,医院ID是02,但是如果你去职位表,被推荐的职位ID可能很容易得到一个不同的医院ID例如03)。Makine复合外键,指两个不同的表格

我在想,可能会有创建一个复合外键,同时引用两个不同的表。如果不是这样,是解决问题的唯一方法,只需从采访表中完全删除医院ID列?

我一直在使用mySQL工作台,所以我手边没有任何SQL代码,但如果需要额外的信息(例如ERR图像)来回答这个问题,我会尽我所能来源。

回答

0

简短的回答: 没有,外键约束总是引用正好一个父表。

但是,如果我理解你的处境好了,你有4个表

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

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

简单的方法EAV添加另一个表调用it hospital_postition,即拥有所有医院的所有职位,然后将每个hospital_postition与采访中的受访者联系起来

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

少即是多!

您有这个问题,因为表格不是第三范式。 hospital_id不依赖于面试,它取决于职位,position_id不是这个能力的关键。

问问自己,我真的想在采访表中记录hospital_id吗?您可能需要的所有信息都已存储在职位表中。我可以想到的唯一理由是想要这个专栏的时候,你会在那个位置所在的医院以外的医院进行采访。如果是这种情况,那么你的模式已经是正确的,但你的问题意味着否则。

从采访表中删除hospital_id列,您的问题将奇迹般消失。

在获得表定义(SQL代码)从MySQL工作台的主题,试试这个:

  • 右键单击模式浏览器
  • 选择“发送到SQL编辑器”中的表名
  • 选择“创建语句”