为啥我需要将子表的主键作为父表的外键,而不是相反的 1:1 识别关系?

Posted

技术标签:

【中文标题】为啥我需要将子表的主键作为父表的外键,而不是相反的 1:1 识别关系?【英文标题】:Why I need to have a primary key of a child table as a foreign key of a parent table and not vice versa for 1:1 identified relationship?为什么我需要将子表的主键作为父表的外键,而不是相反的 1:1 识别关系? 【发布时间】:2020-12-19 20:26:03 【问题描述】:

试图理解数据库概念并遇到这个问题。 识别关系是父表pk是子表fk的时候。例如,我有一个person 表和ssn 表。 ssn 不能在没有 person 的情况下存在,而 person 只能有 1 个 ssnssn 只能属于 1 个人,因此应该是 1:1 确定的关系。

问题#1:如果我可以唯一标识ssn,我需要将person_id 作为SSN 表的主键,因为它已经是唯一的了吗? 当我将SSN 表中的person_id 设置为Person 表中id 的外键时,我的SQl 工作台创建了1:n 关系。但是,这是不准确的,因为一个人只能有 1 个 ssn(图 1)

问题 #2 - 为什么会发生这种情况,因为它也可以是 1:1 关系,我可以轻松地根据 person_id fk 查询 ssn 如果我从 SSN 表中重新删除 person_id 作为主键,则关系变得无法识别(图 2)

问题 #3 - 为什么会发生,因为我 仍然可以在没有 person_id 字段的情况下唯一识别 ssn

如果我使用工作台创建 1:1 身份关系,它会在 PERSON 表中创建一个外键,从而使其成为子表和 SSN 父表,这也不准确 我知道人们建议只是在存在 1:1 识别关系时将数据简单地放入父表中,但是如果例如一个表已经有 20 个字段并且添加另外 20 个字段会使其变得超级大,那就不容易了创建一个单独的表并将它们链接成 1:1 关系(图 3)

问题 #4:很容易记住 - 如果 1:1 将父表 fk 设置为子表 pk 并且如果 1:n - 将子表 fk 设置为父表 pk 但我想了解它背后的逻辑是什么? 先感谢您 enter image description here

【问题讨论】:

如果是 1:1,为什么你有一个单独的 ssn 表? ssn不只是person的一个属性吗? 如果我可以唯一标识 ssn,为什么我需要将 person_id 作为 SSN 表上的主键,因为它已经是唯一的了? o_O 你不需要这个。 除非 ssn 表中有很多额外的数据,否则可以通过将 ssn 设置为带有unique index 的人员列来解决此问题。 【参考方案1】:

如果是 1:1,则没有“父母”或“孩子”——他们是彼此的“兄弟姐妹”。

存在问题标题的要求,因为没有反向外键,它不会是 1:1,而是 1:0..*(一对多)。

为了保证 1:1 双方必须存在并且做到这一点的方法是使用双向 FK。

【讨论】:

以上是关于为啥我需要将子表的主键作为父表的外键,而不是相反的 1:1 识别关系?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的外键foreign key

子表,父表;一对多,多对一;主键,外键梳理。

补12.关于mysql的外键约束

SQL如果建立子表

Mysql-外键foreign key

父表的主键是子表的主键,如何使用jpa进行映射?