我还不能完全理解这些差异。你能描述这两个概念并使用真实世界的例子吗?


当前回答

非识别关系

非识别关系意味着孩子与父母有亲属关系,但可以单独识别。

PERSON    ACCOUNT
======    =======
pk(id)    pk(id)
name      fk(person_id)
          balance

ACCOUNT和PERSON之间的关系无法识别。

确定关系

认同关系意味着需要父母给予孩子身份。孩子只因父母而存在。

这意味着外键也是主键。

ITEM      LANGUAGE    ITEM_LANG
====      ========    =========
pk(id)    pk(id)      pk(fk(item_id))
name      name        pk(fk(lang_id))
                      name

ITEM_LANG和ITEM之间的关系正在识别。以及ITEM_LANG和LANGUAGE之间的关系。

其他回答

标识关系是指子表中的行是否存在取决于父表中的某一行。这可能会让人困惑,因为现在通常的做法是为子表创建一个伪密钥,但不将外键作为子表主键的父部分。从形式上讲,这样做的“正确”方法是让外键成为孩子的主键的一部分。但逻辑关系是,没有父母,孩子就不可能存在。示例:一个人有一个或多个电话号码。如果他们只有一个电话号码,我们可以简单地将其存储在Person列中。因为我们希望支持多个电话号码,所以我们创建了第二个表PhoneNumbers,其主键包括引用person表的person_id。我们可能会认为电话号码属于一个人,尽管它们被建模为单独表格的属性。这是一个很好的线索,表明这是一种识别关系(即使我们没有在PhoneNumbers的主键中包含person_id)。非标识关系是指父级的主键属性不能成为子级的主键。一个很好的例子是查找表,例如Person.state上的外键引用States.state的主键。Person是与States相关的子表。但是Person中的一行不通过其state属性标识。即状态不是Person主键的一部分。非标识关系可以是可选的或强制性的,这意味着外键列分别允许NULL或不允许NULL。


另请参阅我对“仍然困惑于确定与不确定关系”的回答

这里有一个很好的描述:

两个实体之间的关系可分为“识别”或“非识别”。当父实体的主键包含在子实体的主键中时,存在识别关系。另一方面,当父实体的主键包含在子实体中但不作为子实体主键的一部分时,存在非标识关系。此外,不可识别的关系可进一步分类为“强制性”或“非强制性”。当子表中的值不能为空时,存在强制的非标识关系。另一方面,当子表中的值可以为空时,存在非强制的非标识关系。

http://www.sqlteam.com/article/database-design-and-modeling-fundamentals

下面是一个识别关系的简单示例:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (PK, FK to Parent.ID) -- notice PK
Name

这里有一个对应的非识别关系:

Parent
------
ID (PK)
Name

Child
-----
ID (PK)
ParentID (FK to Parent.ID) -- notice no PK
Name

假设我们有这些桌子:

user
--------
id
name


comments
------------
comment_id
user_id
text

这两个表之间的关系将确定关系。因为,评论只能属于其所有者,而不能属于其他用户。例如每个用户都有自己的评论,当用户被删除时,该用户的评论也应被删除。

对Daniel Dinnyes回答的补充:

在非标识关系中,不能使用相同的值两次使用相同的主键列(例如,“ID”)。

但是,使用identifynig关系,可以为“ID”列显示两次相同的值,只要它具有不同的“otherColumn_ID”外键值,因为主键是两列的组合。

请注意,FK是否为“非空”并不重要!;-)

两个强大的实体之间存在着识别关系。非识别关系不一定是强实体和弱实体之间的关系。可能存在这样的情况:子实体本身具有主键,但其实体的存在可能取决于其父实体。

例如:卖家和一本书之间的关系,其中一本书正由卖家出售,卖家可能有自己的主键,但其实体仅在出售一本书时创建

基于Bill Karwin的参考