【发布时间】: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 的人员列来解决此问题。
标签: mysql sql mysql-workbench