为什么在确定关系的主键的外键的一部分?(Why is the foreign key part of

2019-07-03 16:10发布

我想了解一个概念,而不是固定的一段代码,将无法正常工作。

我会采用这样的形式 (父表)的一般例子和一个表单字段 (子表)。 逻辑上 ,这将是一个识别关系,因为表单字段不能没有形式存在。

这让我觉得,为了翻译的逻辑关系到技术的关系,一个简单的NOT NULL在form_field表form_id场就足够了。 (参见上面的截图的左侧部分)。

然而,当我添加使用MySQL Workbench中识别的关系,form_id不仅NOT NULL也是主键的一部分。 (参见上面的截图的右侧部分)。当我添加非识别关系, NOT NULL仍施加,从而在逻辑上它实际上是一个标识关系为好。

我想这让我困惑的是到现在为止我一直只是用ID字段作为主键一点点,还有的事实。

所以,我理解确定与非确定关系的逻辑概念,但我不明白的技术部分。

为什么呢,因为这个答案状态“的‘正确’的方式使孩子的主键的外键的一部分”?

什么是这些复合主键的好处?

Answer 1:

逻辑上,这将是一个识别关系,因为表单字段不能没有形式存在。

否,确定关系是关于识别,不存在。

任何X:Y关系,其中左侧的X> = 1个保证存在,是否识别与否。 在你的情况下,1:N的关系保证的存在form对于任何给定form_field 。 你可以把它识别或不识别,它仍然会保证相同。

备注:

  • 您将通过模型做一个标识关系form_field.form_id一个重要的组成部分。 例如form_field PK可能看起来像: {form_id, label} ,这BTW是正确颇有裨益群集您的数据(InnoDB表都始终集群 )。
  • 只是让一个PK: {id, form_id}是不正确的,因为这是超密钥不是候选键(即它是不是最小的-我们可以删除form_id从它和仍然保留的唯一性)。
  • 通过使N的关系:你会建模0..1 form_field.form_id为空的( -见下文,但那么你就无法让它识别以及)。

还有的“确定关系”的两个定义:

  • 严格的定义 :迁移父钥匙插入子主键1的关系。
  • 松散的定义 :迁移父钥匙插入子键的关系。

换句话说,松定义允许迁移进入备用键以及(不只是主)。

大多数工具2看起来虽然使用严格的定义,因此,如果您标记的关系作为确定,将自动使孩子PK的迁移属性的一部分,没有PK的属性可以为NULL。


1,然后将其或者完全从迁移属性组成,或者是迁移属性和一些额外的属性的组合。

2 ERwin的和Visio做。 我没有使用MySQL工作台为尚未造型,但你的描述似乎表明它的行为是相同的。



Answer 2:

的识别关系被认为是其中的主键包括外键的属性。 这就是为什么当你指定为标识的发布外键关系被认为是主键的一部分。

一个“识别”的关系和非识别之间的区别纯粹是信息或图解如果相同的键约束和非空约束在每种情况下适用。 该概念类似于并指定一个“主”键的结果。 如果一个表有多个候选键,那么所有其他的事情都是平等的它不会从哪个键被指定为初级一个逻辑的角度关系 - 的形式,功能和(大概)表的业务含义是一样的。

在你的榜样但是,两个表中的键是不一样的。 在第一种情况ID在form_field表独特而在第二种情况下,它显然不是。 我希望这不是你的原意。



文章来源: Why is the foreign key part of the primary key in an identifying relationship?