标识关系是指子表中存在的行取决于父表中的行。这可能会令人困惑,因为现在通常的做法是为子表创建伪代码,但不要将外键设置为子代主键的父部分。在形式上,这样做的 “正确” 方法是使外键成为孩子主键的一部分。但逻辑关系是,没有父母,孩子就不能存在。
示例:一个Person
有一个或多个电话号码。如果他们只有一个电话号码,我们可以简单地将其存储在Person
列中。由于我们想要支持多个电话号码,我们制作第二个表PhoneNumbers
,其主键包括引用Person
表的person_id
。
我们可能会将电话号码视为属于某个人,即使它们被建模为单独表格的属性。这是一个强有力的线索,这是一种识别关系(即使我们在PhoneNumbers
的主键中没有字面上包含person_id
)。
非标识关系是指父级的主键属性不能成为子级的主键属性。的一个很好的例子是一个查找表,如一个外键Person.state
引用的主键States.state
。 Person
是关于States
的儿童表。但是Person
的一行不是由其state
属性标识的。即state
不是Person
的主键的一部分。
非标识关系可以是可选的或强制的 ,这意味着外键列分别允许 NULL 或不允许 NULL。
另请参阅我对仍然困惑关于识别与非识别关系的答案
现实世界还有另一种解释:
一本书属于一个所有者,一个所有者可以拥有多本书。但是,这本书也可以在没有所有者的情况下存在,并且它的所有权可以从一个所有者变为另一个。书与所有者之间的关系是一种非识别关系。
然而,一本书是由作者撰写的,作者本可以写多本书。但是,这本书需要由作者撰写 - 没有作者就不可能存在。因此,书与作者之间的关系是一种识别关系。
标识关系指定在没有父对象的情况下子对象不能存在
非标识关系指定对象之间的常规关联,1:1 或 1:n 基数。
如果父级不是必需的,则可以将非标识关系指定为可选,或者通过设置父表基数,在需要父级的情况下将非标识关系指定为必需关系...