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


800

我无法完全掌握差异。您能否同时描述两个概念并使用真实示例?


11
这个问题的答案是如此令人困惑,这并不好笑
Dennis

好问题,车轮不会被重塑:彼得·陈。实体关系模型,走向统一的数据视图,1976年,第2.3.2节:“ 如果使用关系来标识实体,我们将其称为弱实体关系。如果不使用关系来标识实体,则我们将称为它是一个常规的实体关系 ”。OP问题归结为:什么是弱实体/常规实体关系?
分钟

Answers:


1063
  • 一个确定的关系是当一个子表行的存在依赖于父表中的一行。这可能会造成混淆,因为这是当今常见的做法,即为子表创建伪密钥,但将外键作为子主键的父部分。正式地,执行此操作的“正确”方法是使外键成为孩子的主键的一部分。但是逻辑关系是,没有父母就不能存在孩子。

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

    即使电话号码被建模为单独表格的属性,我们也可能认为电话号码属于一个人。这有一个很强的线索,那就是这是一种确定的关系(即使我们没有在字面上包含person_id的主键PhoneNumbers)。

  • 当父级的主键属性不能成为子级的主键属性时,这是一种非身份关系。查找表就是一个很好的例子,例如,引用的主键的外键。 是关于的子表。但是,行中的行未通过其属性标识。即不是的主键的一部分。Person.stateStates.statePersonStatesPersonstatestatePerson

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


另请参阅我对仍然对识别和非识别关系感到困惑的答案


9
+1:Bill,“如今,通常为子表创建伪键,但不将外键设为子主键的父部分”,这是为什么?谷歌让我失望。
hobodave

17
似乎“适当地”构造了标识关系会导致令人讨厌的巨大主键。例如,建筑物有地板有房间有床。Bed的PK为(bed_id,floor_id,room_id,building_id)。我在实践中从未见过此事,也从未听说过建议将其作为执行任何操作的一种方式,这似乎很奇怪。PK中有很多冗余数据。
hobodave

24
@hobodave:我见过更大的多列主键。但我同意你的观点。考虑到多列主键可以传达更多信息;您可以在Beds表格中查询特定建筑物中的所有床位,而无需进行任何连接。
Bill Karwin 2010年

2
@Eugene,是的,我希望这是一种无法确定的关系。 user_id应该是主键本身,而updated_by不是多列主键的一部分。
Bill Karwin 2011年

4
我将永远不会用它来建模。最佳答案来自下面的“ aqsa rao”,其中指出:“识别关系意​​味着没有父表就不能唯一地标识子表。” 因为您的定义添加了不必要的语义,可能会使人们感到困惑。创建标识或非标识关系的原因不是实体之间的依赖关系。
塞巴斯蒂安

887

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

一本书属于一个所有者,一个所有者可以拥有多本书。但是,这本书也可以在没有所有者的情况下存在,并且其所有权可以从一个所有者更改为另一个所有者。书籍和所有者之间的关系是一种非身份关系。

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


2
一个不错的解释,但我认为将示例扩展一点也很有帮助。一本书有很多页。没有页面就不可能存在它,因此我们可以得出这样的结论:一本书与其拥有的页数之间的关系也是一种识别关系。但是,“页数”属性是否会成为该书的任何标识方案(密钥)的一部分?可能不是。术语“识别关系”通常保留给涉及识别属性(关系术语中的主要属性)的关系。
nvogel

13
如果这本书是由多于一位作者撰写的,会发生什么?它不再以M:N类型标识关系,为什么?
NGix

2
这些真实的例子是没有用的。当您意识到如何在ER中创建表以及如何保持数据完整性时,您就可以丢弃这些示例。如果您在两个实体之间创建了牢固的关系,则必须在实体表中与来自另一个实体的PK一起创建主键。如果您的模型允许您同一本书可以有多个作者,那么坚强是可以的。但是,如果您的模型只允许您1作者1本书,那么使用牢固的关系就不会有该约束,因为PK(Book.id, Book.person_id)
塞巴斯蒂安

2
但是真正的用法是“没有作者的书可以存在吗?”。答案是肯定的,因为人们会直接寻找这本书。因此,实际上,在这种情况下,它们应始终是“非身份关系”。
windmaomao

3
怎么回事!!,这不是一个有效的例子the Identifying relationship !是的,没有作者就无法写书,但是,books表中的author字段无法识别书行!
会计师م16年

33

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

一遍又一遍地讲,在和父母的关系中,没有父母就不能存在孩子。(例如user287724)。的确如此,但是完全错了。要使外键为非空就足够了。它不必是主键的一部分。

所以这是真正的原因:

识别关系的目的是外键永远都不能改变,因为它是主键的一部分... 因此可以识别!


2
+1表示“外键为非空就足以实现此目的。” 它应该足够了,但是不幸的是,并不是像Entity Framework这样的东西,除非您使用标识关系,否则它就无法正常工作,但是由于只是复合键的一部分。
Triynko

25

标识关系指定没有父对象就不能存在子对象

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

通过设置父表基数,可以在不需要父级的情况下将非标识关系指定为可选,在不需要父级的情况下可以将其指定为强制性...


6
这听起来更像是对一种关系中的全部参与的描述,而不是对一种确定性关系的描述。
Thomas Padron-McCarthy

1
您实际上是在与一个拥有218k声誉的人竞争。只是把它扔在那里,因为你们俩绝对比我了解更多。
Marc DiMillo

我不同意以上定义。您可能有一个依赖于其父对象的对象,并且希望将该对象限制为仅与1个父行链接。A HouseWalls。您卸下房屋,没有墙壁。但是墙只属于一所房子。因此建立强关系是行不通的:PK(Wall.id, House.id)将允许您将模型中的同一堵墙插入另一栋房屋。
塞巴斯蒂安

15

这是一个很好的描述:

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

1
您的答案与Bill Karwin给出的答案相冲突,区别在于外键“不是”或“必须”不是“子级”行的主键的一部分。
妮可

@Andy White但是,当标识关系是三列复合主键的一部分时,标识关系中父级的主键是否可以是非强制性的,即为null?
Frederik Krautwald 2015年

10

user287724的答案给出了以下书籍和作者关系的示例:

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

这是一个非常混乱的例子,绝对不是一个有效的例子identifying relationship

是的,book不能在没有至少一个写author,但author(它的外键)的book不标识bookbooks表!

您可以删除author从(FK)book行,仍然可以通过一些其他的领域(鉴定书行ISBNID...等),但书的不是作者!

我认为identifying relationship(产品表)与(特定产品详细资料表)之间的关系是一个有效的例子1:1

products table
+------+---------------+-------+--------+
|id(PK)|Name           |type   |amount  |
+------+---------------+-------+--------+
|0     |hp-laser-510   |printer|1000    |
+------+---------------+-------+--------+
|1     |viewsonic-10   |screen |900     |
+------+---------------+-------+--------+
|2     |canon-laser-100|printer|200     |
+------+---------------+-------+--------+

printers_details table
+--------------+------------+---------+---------+------+
|Product_ID(FK)|manufacturer|cartridge|color    |papers|
+--------------+------------+---------+---------+------+
|0             |hp          |CE210    |BLACK    |300   |
+--------------+------------+---------+---------+------+
|2             |canon       |MKJ5     |COLOR    |900   |
+--------------+------------+---------+---------+------+
* please note this is not real data

在这个例子中,Product_IDprinters_details台被认为是一个FK引用的products.id表,也是一个PKprinters_details表,这是因为一个确定的关系Product_ID在打印机表(FK)是识别子表中的行,我们不能删除在product_id从子表,因为我们无法确定行了,因为我们失去了它的主键

如果要将其分为两行:

标识关系是当子表中的FK被视为子表中的PK(或标识符)而仍引用父表时的关系

另一个例子可能是您在某个国家/地区数据库的进出口中有3个表(进口-产品-国家)

import表是具有以下字段的孩子(product_id(FK),country_id(FK),进口数量,价格,进口单位,运输方式(空运,海运)) we may use the (product_id , thecountry_id`)导入行“如果它们都在同一年”,则这两列可以在子表(导入)中构成主键,也可以在其中引用父表。

请感到高兴,我终于理解了identifying relationship和的概念non identifying relationship,所以请不要告诉我我对所有这些完全无效的示例的投票都错了

是的,从逻辑上说,没有作者就不能写书,但是没有作者就可以识别书,实际上,作者也不能识别书!

您可以100%从书本行中删除作者,但仍然可以识别书本!


5
如果您只有餐桌和作家,那您是对的。那里没有识别关系。但是,如果您使用第三个表来表示多对多关系,则该第三个表的主键由两个外键组成,这两个外键引用了books表和authors表。该表与书籍和作者都有识别关系。请参阅我在stackoverflow.com/questions/2814469/…中的
Bill Karwin

8

非身份关系

非身份关系意味着孩子与父母有亲戚关系,但可以通过自己的身份来识别。

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之间。


2
PERSON和ACCOUNT如何无法识别?没有PERSON,ACCOUNT如何存在?
MrRobot18年

为什么前面的评论没有答案?@ MrRobot9
AAEM

4

如果您认为在删除父项时应删除子项,则这是一种识别关系。

如果即使删除了父项也应保留子项,那么这是一个不确定的关系。

例如,我有一个培训数据库,其中包含受训者,培训,文凭和培训课程:

  • 学员与培训课程有明确的关系
  • 培训与培训课程有明确的关系
  • 但是受训者与文凭之间的身份不明

如果删除了相关的受训者,培训或文凭之一,则仅应删除培训课程。


3

识别关系意​​味着子实体完全取决于父实体的存在。示例帐户表人员表和人员帐户。人员帐户表仅通过帐户和人员表的存在来标识。

非标识关系表示子表未通过父表的存在进行标识,例如存在表为accounttype和account.accounttype表未通过account表的存在进行标识。


2

就像在下面的链接中很好解释的那样,在ER概念模型中,标识关系有点像与其父级的弱实体类型关系。用于数据建模的UML样式的CAD不使用ER符号或概念,并且关系的类型是:识别,不识别和非特定。

标识的关系是父/子关系,其中子是一种弱实体(即使在传统的ER模型中,它也称为标识关系),由于其自​​身的属性没有真正的主键,因此无法通过其自身唯一地标识。在物理模型上,对子表的每次访问都将(在语义上包括)父级主键,这将成为子级主键(也就是外键)的一部分或全部,通常会产生复合键在孩子方面。子级本身的最终现有密钥仅是伪密钥或部分密钥,不足以标识该类型的实体或实体集的任何实例,而没有父级的PK。

非标识关系是完全独立的实体集的普通关系(部分或全部),其实例不依赖于彼此的主键进行唯一标识,尽管它们可能需要部分或全部关系的外键,但不是作为孩子的主键。孩子有自己的主键。父同上。两者独立。根据关系的基数,一个的PK作为FK传递至另一(N端),如果是部分,则可以为null,如果为总计,则不能为null。但是,在这样的关系中,FK永远也不会是孩子的PK,就像确定性的关系一样。

http://docwiki.embarcadero.com/ERStudioDA/XE7/en/Creating_and_Editing_Relationships


2

从父级迁移到子级的属性是否有助于标识1个子级?

  • 如果:标识相关性存在,则关系为标识,子实体为“弱”。
  • 如果不存在:则不存在标识依赖性,则该关系为非标识关系,并且子实体为“强”。

请注意,标识依赖性意味着存在依赖性,但并非相反。每个非NULL FK表示没有父级就不能存在子级,但是仅此一项就不能确定关系。

有关此内容(和一些示例)的更多信息,请查看《ERwin方法指南》的“识别关系”部分。

PS:我意识到自己(晚些时候)来晚了,但是我觉得其他答案不是很准确(用存在依赖而不是标识依赖来定义),或者有些曲折。希望这个答案可以提供更多的清晰度...


1子代的FK是子代的PRIMARY KEY或(非NULL)UNIQUE约束的一部分。


1

一个很好的例子来自订单处理。来自客户的订单通常具有标识该订单的订单号,每个订单一次出现的一些数据(例如订单日期和客户ID)以及一系列订单项。每个订单项都包含一个商品编号,用于标识订单中的订单项,订购的产品,该商品的数量,该商品的价格以及该订单项的数量,可以通过将数量乘以价钱。

标识订单项的数字只能在单个订单的上下文中进行标识。每个订单中的第一行项目均为项目编号“ 1”。订单项的完整标识是项目编号及其所属的订单号。

因此,订单和订单项之间的父子关系是一种识别关系。ER建模中一个密切相关的概念被称为“ subentity”,其中订单项是订单的subentity。通常,子实体与其所属的实体具有强制性的子-父身份标识关系。

在经典数据库设计中,LineItems表的主键将是(OrderNumber,ItemNumber)。当今的某些设计人员会给一个项目一个单独的ItemID,该ID作为主键,并且由DBMS自动递增。在这种情况下,我建议采用经典设计。


0

假设我们有这些表:

user
--------
id
name


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

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


0

标识关系是两个强实体之间的关系。非识别关系可能并不总是强实体和弱实体之间的关系。可能存在一个情况,即孩子本身具有主键,但是其实体的存在可能取决于其父实体。

例如:在卖方可能拥有自己的主键,但仅在出售书时才创建其实体的情况下,卖方与某本书之间的关系可能存在于卖方正在出售书的情况下

参考依据Bill Karwin


5
在此处定义“强”和“弱”实体的含义可能会有所帮助。
nullability 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.