SQL 中的识别与非识别关系
Identifying Vs Non-Identifying relationships in SQL
我最近开始使用 MySQL Workbench 来管理 EER 图。到目前为止,我一直在使用 phpmyadmin,但我从未遇到过识别和非识别关系这两个术语。
我已经在线查找了差异并阅读了一些关于该主题的 Stack Overflow 答案,但我仍然一无所知。
根据我的理解,我将在我的数据库中给出一个场景示例,我将提出正确的解决方案。
所以在我的数据库中我有一个 users
table 和一个 contact
table 包含各种联系用户的方法(例如电子邮件和 phone 数字)。由于联系记录不与用户相关就不可能存在,因此这应该是 identifying 关系。
这是我的 table 的样子:
+-------+ +-------+
| users | |contact|
+-------+ +-------+
| id | |id |
+-------+ |userid |
|contact| // contains email or phone
|type | // specifies if email or phone
+-------+
但是,当我在两个 table 之间创建 标识 关系时,它使 userId
成为复合键的一部分。我知道 table 可以有一个由 userid
和 contact
组成的复合主键,但是希望在整个数据库中保持一致的结构,其中每个 table 都有自己的代理键。 (我多次看到使用代理键比使用复合键更好。)
那么在这种情况下,真正正确的做法是什么?我应该使用复合键并废弃代理键(我真的不想这样做)吗?还是在这种情况下我应该使用 非识别 关系?
请准确解释这两种关系之间的区别是什么以及为什么识别关系需要指向属于复合键。
这听起来像是一种非识别关系,其中父项的主键存在于子项中但不是子项主键的一部分 - 假定子实体 (contact
) 有自己生成的主键。
识别关系意味着父实体的主键是自然键的一部分(应该是复合的,除非实体是 1:1),并且现在通常不流行。
就数据库设计而言,识别与非识别在现实世界中是非常罕见的区别。我遇到或设计的大多数数据模型在每个实体上都有一个主键,以及一个从其他实体到引用它的任何对象的主键的外键。我或我认识的任何其他数据建模者偶尔会通过使用数据库约束在自然键级别强制执行唯一性。
我最近开始使用 MySQL Workbench 来管理 EER 图。到目前为止,我一直在使用 phpmyadmin,但我从未遇到过识别和非识别关系这两个术语。
我已经在线查找了差异并阅读了一些关于该主题的 Stack Overflow 答案,但我仍然一无所知。
根据我的理解,我将在我的数据库中给出一个场景示例,我将提出正确的解决方案。
所以在我的数据库中我有一个 users
table 和一个 contact
table 包含各种联系用户的方法(例如电子邮件和 phone 数字)。由于联系记录不与用户相关就不可能存在,因此这应该是 identifying 关系。
这是我的 table 的样子:
+-------+ +-------+
| users | |contact|
+-------+ +-------+
| id | |id |
+-------+ |userid |
|contact| // contains email or phone
|type | // specifies if email or phone
+-------+
但是,当我在两个 table 之间创建 标识 关系时,它使 userId
成为复合键的一部分。我知道 table 可以有一个由 userid
和 contact
组成的复合主键,但是希望在整个数据库中保持一致的结构,其中每个 table 都有自己的代理键。 (我多次看到使用代理键比使用复合键更好。)
那么在这种情况下,真正正确的做法是什么?我应该使用复合键并废弃代理键(我真的不想这样做)吗?还是在这种情况下我应该使用 非识别 关系?
请准确解释这两种关系之间的区别是什么以及为什么识别关系需要指向属于复合键。
这听起来像是一种非识别关系,其中父项的主键存在于子项中但不是子项主键的一部分 - 假定子实体 (contact
) 有自己生成的主键。
识别关系意味着父实体的主键是自然键的一部分(应该是复合的,除非实体是 1:1),并且现在通常不流行。
就数据库设计而言,识别与非识别在现实世界中是非常罕见的区别。我遇到或设计的大多数数据模型在每个实体上都有一个主键,以及一个从其他实体到引用它的任何对象的主键的外键。我或我认识的任何其他数据建模者偶尔会通过使用数据库约束在自然键级别强制执行唯一性。