协慌网

登录 贡献 社区

识别和非识别关系之间有什么区别?

我无法完全掌握差异。你能描述这两个概念并使用现实世界的例子吗?

答案

  • 标识关系是指子表中存在的行取决于父表中的行。这可能会令人困惑,因为现在通常的做法是为子表创建伪代码,但不要将外键设置为子代主键的父部分。在形式上,这样做的 “正确” 方法是使外键成为孩子主键的一部分。但逻辑关系是,没有父母,孩子就不能存在。

    示例:一个Person有一个或多个电话号码。如果他们只有一个电话号码,我们可以简单地将其存储在Person列中。由于我们想要支持多个电话号码,我们制作第二个表PhoneNumbers ,其主键包括引用Person表的person_id

    我们可能会将电话号码视为属于某个人,即使它们被建模为单独表格的属性。这是一个强有力的线索,这是一种识别关系(即使我们在PhoneNumbers的主键中没有字面上包含person_id )。

  • 非标识关系是指父级的主键属性不能成为子级的主键属性。的一个很好的例子是一个查找表,如一个外键Person.state引用的主键States.statePerson是关于States的儿童表。但是Person的一行不是由其state属性标识的。即state不是Person的主键的一部分。

    非标识关系可以是可选的强制的 ,这意味着外键列分别允许 NULL 或不允许 NULL。


另请参阅我对仍然困惑关于识别与非识别关系的答案

现实世界还有另一种解释:

一本书属于一个所有者,一个所有者可以拥有多本书。但是,这本书也可以在没有所有者的情况下存在,并且它的所有权可以从一个所有者变为另一个。书与所有者之间的关系是一种非识别关系。

然而,一本书是由作者撰写的,作者本可以写多本书。但是,这本书需要由作者撰写 - 没有作者就不可能存在。因此,书与作者之间的关系是一种识别关系。

标识关系指定在没有父对象的情况下子对象不能存在

非标识关系指定对象之间的常规关联,1:1 或 1:n 基数。

如果父级不是必需的,则可以将非标识关系指定为可选,或者通过设置父表基数,在需要父级的情况下将非标识关系指定为必需关系...