为什么我需要将子表的主键作为父表的外键,而对于 1:1 标识的关系,反之亦然?

问题描述

试图理解数据库概念并遇到了这个问题。 识别关系是当父表pk 是子表fk 时。例如,我有一个 person 表和 ssn 表。如果没有 ssnperson 就不能存在,而 person 只能有 1 个 ssn,而 ssn 只能属于 1 个人,所以它应该是 1:1 识别的关系。

问题 1:如果我可以唯一标识 person_id,因为它已经是唯一的,我是否需要将 SSN 作为 ssn 表上的主键? 当我将 person_id 表中的 SSN 设置为 id 表中 Person 的外键时,我的 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,则没有“父母”或“孩子”——他们是彼此的“兄弟姐妹”。

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

要保证 1:1 双方必须存在,而实现这一点的方法是使用双向 FK。