sql – 为什么主键的外键部分在识别关系中?

好的,我希望这是一个适合于stackoverflow的问题,因为我正在试图理解一个概念,而不是修复一段不起作用的代码.

我将介绍一个表单(父表)和表单域(子表)的一般示例.逻辑上,这将是一个识别关系,因为一个表单域不能存在没有一个表单.

这将使我认为为了将逻辑关系转换为技术关系,form_field表中的form_id字段的简单NOT NULL就足够了. (见上图左边的截图)

然而,当我使用MysqL Workbench添加一个识别关系时,form_id不仅不是NULL,也是主键的一部分. (见上面右侧部分截图)
当我添加一个非识别关系时,NOT NULL仍然在逻辑上应用,它实际上也是一个识别关系.

我想这有点让我困惑,以及到现在为止,我总是只用id字段作为主键.

所以我理解识别与非识别关系的逻辑概念,但我不明白技术部分.为什么呢,就像this answer所说的,“把小孩主要关键部分的”正确的“方式呢?这些复合主键的好处是什么?

解决方法

Logically,this would be an identifying relationship,since a form field cannot exist without a form.

不,识别关系是关于识别,而不是存在.

任何X:Y关系,其中X> = 1保证了左侧的存在,无论是否识别.在你的情况下,1:N关系保证任何给定form_field的形式存在.您可以使其识别或不识别,并且仍然可以保证相同.

备注:

>您将通过将form_field.form_id作为键的一部分来建模识别关系.例如,form_field PK可能看起来像:{form_id,label},其中BTW对于您的数据的适当clustering(InnoDB表为always clustered)将是非常有益的.
>只要做一个PK:{id,form_id}就不正确了,因为这个超级键不是一个候选键(也就是说它不是最小的 – 我们可以从中删除form_id并且仍然保留唯一性).
>您将通过使form_field.form_id为空(可以使您无法将其识别为 – 见下文)来建模0..1:N关系.

“识别关系”有两个定义:

>严格定义:将父密钥迁移到子主键1中的关系.
>宽松的定义:将父键迁移到子键的关系.

换句话说,松散的定义允许迁移到备用键(而不仅仅是主键).

大多数工具2似乎都使用了严格的定义,因此如果将关系标记为标识,则会自动将迁移的属性作为子项PK的一部分,并且PK属性都不能为NULL.

1然后完全由迁移的属性组成,或者是迁移的属性和一些其他属性的组合.

2 ERwin和Visio做.我还没有使用MysqL Workbench进行建模,但是你的描述似乎表明它的行为是一样的.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...