为啥我需要将子表的主键作为父表的外键,而不是相反的 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 个 ssn
和 ssn
只能属于 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 识别关系?的主要内容,如果未能解决你的问题,请参考以下文章