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


当前回答

假设我们有这些桌子:

user
--------
id
name


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

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

其他回答

假设我们有这些桌子:

user
--------
id
name


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

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

识别关系意味着子实体完全依赖于父实体的存在。

示例帐户表人员表和人员帐户。人员帐户表仅通过帐户和人员表的存在来标识。

非标识关系意味着父表的存在不标识子表。

示例accountType和account.accountType表未标识为存在科目表。

比尔的回答是正确的,但令人震惊的是,在所有其他答案中,没有人指出最重要的方面。

人们一再强调,在一种确定的关系中,没有父母,孩子是不可能存在的。(例如用户287724)。这是真的,但完全没有抓住重点。外键为非空就足够了。它不需要是主键的一部分。

因此,真正的原因是:

识别关系的目的是,外键永远不会更改,因为它是主键的一部分。。。因此识别!!!

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

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

基于Bill Karwin的参考

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


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