我无法完全掌握差异。您能否同时描述两个概念并使用真实示例?
我无法完全掌握差异。您能否同时描述两个概念并使用真实示例?
Answers:
一个确定的关系是当一个子表行的存在依赖于父表中的一行。这可能会造成混淆,因为这是当今常见的做法,即为子表创建伪密钥,但不将外键作为子主键的父部分。正式地,执行此操作的“正确”方法是使外键成为孩子的主键的一部分。但是逻辑关系是,没有父母就不能存在孩子。
示例:A Person
有一个或多个电话号码。如果他们只有一个电话号码,我们可以简单地将其存储在的列中Person
。由于我们要支持多个电话号码,因此我们创建了第二个表PhoneNumbers
,其主键包括person_id
引用该Person
表的内容。
即使电话号码被建模为单独表格的属性,我们也可能认为电话号码属于一个人。这有一个很强的线索,那就是这是一种确定的关系(即使我们没有在字面上包含person_id
的主键PhoneNumbers
)。
当父级的主键属性不能成为子级的主键属性时,这是一种非身份关系。查找表就是一个很好的例子,例如,引用的主键的外键。 是关于的子表。但是,行中的行未通过其属性标识。即不是的主键的一部分。Person.state
States.state
Person
States
Person
state
state
Person
非标识关系可以是可选的或强制的,这意味着外键列分别允许NULL或不允许NULL。
另请参阅我对仍然对识别和非识别关系感到困惑的答案
Beds
表格中查询特定建筑物中的所有床位,而无需进行任何连接。
user_id
应该是主键本身,而updated_by
不是多列主键的一部分。
现实世界还有另一种解释:
一本书属于一个所有者,一个所有者可以拥有多本书。但是,这本书也可以在没有所有者的情况下存在,并且其所有权可以从一个所有者更改为另一个所有者。书籍和所有者之间的关系是一种非身份关系。
但是,一本书是由一位作者撰写的,并且该作者可能写了多本书。但是,这本书需要由作者撰写-没有作者就不可能存在。因此,这本书与作者之间的关系是一种识别关系。
PK(Book.id, Book.person_id)
。
the Identifying relationship
!是的,没有作者就无法写书,但是,books表中的author字段无法识别书行!
标识关系指定没有父对象就不能存在子对象
非识别关系指定对象之间的规则关联,即1:1或1:n基数。
通过设置父表基数,可以在不需要父级的情况下将非标识关系指定为可选,在不需要父级的情况下可以将其指定为强制性...
House
有Wall
s。您卸下房屋,没有墙壁。但是墙只属于一所房子。因此建立强关系是行不通的:PK(Wall.id, House.id)
将允许您将模型中的同一堵墙插入另一栋房屋。
这是一个很好的描述:
两个实体之间的关系可以分类为“识别”或“非识别”。当父实体的主键包含在子实体的主键中时,存在识别关系。另一方面,当父实体的主键包含在子实体中但不作为子实体的主键的一部分时,则存在非标识关系。另外,非识别关系可以进一步分类为“强制性”或“非强制性”。当子表中的值不能为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
user287724的答案给出了以下书籍和作者关系的示例:
但是,一本书是由一位作者写的,而作者可能写了多本书。但是这本书需要作者来写,没有作者就不可能存在。因此,书与作者之间的关系是一种识别关系。
这是一个非常混乱的例子,绝对不是一个有效的例子为identifying relationship
。
是的,book
不能在没有至少一个写author
,但author
(它的外键)的book
是不标识的book
在books
表!
您可以删除author
从(FK)book
行,仍然可以通过一些其他的领域(鉴定书行ISBN
,ID
...等),但书的不是作者!
我认为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_ID
在printers_details
台被认为是一个FK引用的products.id
表,也是一个PK的printers_details
表,这是因为一个确定的关系Product_ID
在打印机表(FK)是识别子表中的行,我们不能删除在product_id
从子表,因为我们无法确定行了,因为我们失去了它的主键
如果要将其分为两行:
标识关系是当子表中的FK被视为子表中的PK(或标识符)而仍引用父表时的关系
另一个例子可能是您在某个国家/地区数据库的进出口中有3个表(进口-产品-国家)
该import
表是具有以下字段的孩子(product_id
(FK),country_id
(FK),进口数量,价格,进口单位,运输方式(空运,海运))
we may use the (
product_id , the
country_id`)导入行“如果它们都在同一年”,则这两列可以在子表(导入)中构成主键,也可以在其中引用父表。
请感到高兴,我终于理解了identifying relationship
和的概念non identifying relationship
,所以请不要告诉我我对所有这些完全无效的示例的投票都错了
是的,从逻辑上说,没有作者就不能写书,但是没有作者就可以识别书,实际上,作者也不能识别书!
您可以100%从书本行中删除作者,但仍然可以识别书本!。
非身份关系
非身份关系意味着孩子与父母有亲戚关系,但可以通过自己的身份来识别。
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之间。
就像在下面的链接中很好解释的那样,在ER概念模型中,标识关系有点像与其父级的弱实体类型关系。用于数据建模的UML样式的CAD不使用ER符号或概念,并且关系的类型是:识别,不识别和非特定。
标识的关系是父/子关系,其中子是一种弱实体(即使在传统的ER模型中,它也称为标识关系),由于其自身的属性没有真正的主键,因此无法通过其自身唯一地标识。在物理模型上,对子表的每次访问都将(在语义上包括)父级主键,这将成为子级主键(也就是外键)的一部分或全部,通常会产生复合键在孩子方面。子级本身的最终现有密钥仅是伪密钥或部分密钥,不足以标识该类型的实体或实体集的任何实例,而没有父级的PK。
非标识关系是完全独立的实体集的普通关系(部分或全部),其实例不依赖于彼此的主键进行唯一标识,尽管它们可能需要部分或全部关系的外键,但不是作为孩子的主键。孩子有自己的主键。父同上。两者独立。根据关系的基数,一个的PK作为FK传递至另一(N端),如果是部分,则可以为null,如果为总计,则不能为null。但是,在这样的关系中,FK永远也不会是孩子的PK,就像确定性的关系一样。
http://docwiki.embarcadero.com/ERStudioDA/XE7/en/Creating_and_Editing_Relationships
从父级迁移到子级的属性是否有助于标识1个子级?
请注意,标识依赖性意味着存在依赖性,但并非相反。每个非NULL FK表示没有父级就不能存在子级,但是仅此一项就不能确定关系。
有关此内容(和一些示例)的更多信息,请查看《ERwin方法指南》的“识别关系”部分。
PS:我意识到自己(晚些时候)来晚了,但是我觉得其他答案不是很准确(用存在依赖而不是标识依赖来定义),或者有些曲折。希望这个答案可以提供更多的清晰度...
1子代的FK是子代的PRIMARY KEY或(非NULL)UNIQUE约束的一部分。
一个很好的例子来自订单处理。来自客户的订单通常具有标识该订单的订单号,每个订单一次出现的一些数据(例如订单日期和客户ID)以及一系列订单项。每个订单项都包含一个商品编号,用于标识订单中的订单项,订购的产品,该商品的数量,该商品的价格以及该订单项的数量,可以通过将数量乘以价钱。
标识订单项的数字只能在单个订单的上下文中进行标识。每个订单中的第一行项目均为项目编号“ 1”。订单项的完整标识是项目编号及其所属的订单号。
因此,订单和订单项之间的父子关系是一种识别关系。ER建模中一个密切相关的概念被称为“ subentity”,其中订单项是订单的subentity。通常,子实体与其所属的实体具有强制性的子-父身份标识关系。
在经典数据库设计中,LineItems表的主键将是(OrderNumber,ItemNumber)。当今的某些设计人员会给一个项目一个单独的ItemID,该ID作为主键,并且由DBMS自动递增。在这种情况下,我建议采用经典设计。
假设我们有这些表:
user
--------
id
name
comments
------------
comment_id
user_id
text
这两个表之间的关系将确定关系。因为注释只能属于其所有者,而不能属于其他用户。例如。每个用户都有自己的注释,删除用户时,该用户的注释也应删除。
标识关系是两个强实体之间的关系。非识别关系可能并不总是强实体和弱实体之间的关系。可能存在一个情况,即孩子本身具有主键,但是其实体的存在可能取决于其父实体。
例如:在卖方可能拥有自己的主键,但仅在出售书时才创建其实体的情况下,卖方与某本书之间的关系可能存在于卖方正在出售书的情况下
参考依据Bill Karwin