问题描述
试图理解数据库概念并遇到了这个问题。
识别关系是当父表pk 是子表fk 时。例如,我有一个 person
表和 ssn
表。如果没有 ssn
,person
就不能存在,而 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。