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