2017-06-21 126 views
2

我最近开始使用MySQL Workbench来管理EER图。直到现在我一直在使用phpmyadmin,我从来没有遇到识别&非识别关系的条款。识别与SQL中的非识别关系

我查了一下网上的差异,并阅读了几个关于该主题的Stack Overflow答案,但我仍然非常无能。

从我的理解,我将举一个我的数据库中的场景的例子,我会提出正确的解决方案。

所以在我的数据库中,我有一个users表,包含了各种方法来联系用户一个contact表(如电子邮件&电话号码)。由于联系人记录不能与用户无关,因此应该是,以确定的关系。

这里是我的表是这样的:

+-------+ +-------+ 
| users | |contact| 
+-------+ +-------+ 
| id | |id  | 
+-------+ |userid | 
      |contact| // contains email or phone 
      |type | // specifies if email or phone 
      +-------+ 

然而,当我创建一个识别两个表之间的关系,它使复合键的userId一部分。我知道该表可以有一个由useridcontact组成的组合主键,但是希望在整个数据库中保持一致的结构,其中每个表都有自己的代理键。 (我多次看到,使用代理键比组合键更好。)

因此,在这种情况下,实际执行此操作的正确方法是什么?我应该使用组合键并取消代理键(我真的不想这么做)?或者我应该在这种情况下使用非识别关系?

请解释清楚这两种关系之间的区别是什么,为什么识别关系需要指向一个领域是复合键的一部分。

+0

你在使用什么,它会自动为你创建密钥? – Barmar

+0

@Barmar“我最近开始使用MySQL Workbench来管理EER图” –

+0

我将不得不删除我的答案并对其进行编辑。必须得到非vs确认使用正确。它会回来的。 “识别关系的技术定义是孩子的外键是其主键的一部分。” – philipxy

回答

2

听起来你有一个非识别关系,其中父项的主键存在于子项中,但不是子项主键的一部分 - 假设子项实体(contact)有其自己的生成首要的关键。

识别关系意​​味着父实体的主键是自然键的一部分(假设是复合的,除非实体是1:1),并且现在一般不是时尚。

在数据库设计方面,识别与非识别在现实世界中相当罕见。我遇到或设计的大多数数据模型都在每个实体上都有一个主键,而其他实体的外键则指向它的任何对象的主键。偶尔,我或我知道的任何其他数据建模者会通过使用数据库约束在自然关键级别强制实现唯一性。

+0

所以你说在我的情况下,我应该使用非识别关系,因为每个实体都有自己的ID? –

+1

是的 - 如果孩子的主要关键是代孕 - 这将违反“识别关系”的定义 –