Loc*_*yen 773 database database-design data-modeling identifying-relationship
我无法完全掌握差异.你能描述这两个概念并使用现实世界的例子吗?
Bil*_*win 1028
一个确定的关系是当一个子表行的存在依赖于父表中的一行.这可能会令人困惑,因为现在通常的做法是为子表创建伪代码,但不要将外键设置为子代主键的父部分.在形式上,这样做的"正确"方法是使外键成为孩子主键的一部分.但逻辑关系是,没有父母,孩子就不能存在.
示例:A Person有一个或多个电话号码.如果他们只有一个电话号码,我们可以简单地将其存储在一列中Person.由于我们想要支持多个电话号码,我们制作了第二个表PhoneNumbers,其主键包括person_id引用Person表.
我们可能会将电话号码视为属于某个人,即使它们被建模为单独表格的属性.这是一个强有力的线索,这是一种识别关系(即使我们不在字面上包含person_id在主键中PhoneNumbers).
阿非识别关系是当父的主键属性不能成为孩子的主键属性.一个很好的例子是查找表,例如Person.state引用主键的外键States.state. Person是一张儿童餐桌States.但是其中的行Person没有通过其state属性标识.即state不是主键的一部分Person.
非标识关系可以是可选的或强制的,这意味着外键列分别允许NULL或不允许NULL.
另请参阅我对仍然困惑关于识别与非识别关系的答案
小智 873
现实世界还有另一种解释:
一本书属于一个所有者,一个所有者可以拥有多本书.但是,这本书也可以在没有所有者的情况下存在,并且它的所有权可以从一个所有者变为另一个.书与所有者之间的关系是一种非识别关系.
然而,一本书是由作者撰写的,作者本可以写多本书.但是,这本书需要由作者撰写 - 没有作者就不可能存在.因此,书与作者之间的关系是一种识别关系.
CMS*_*CMS 24
标识关系指定在没有父对象的情况下子对象不能存在
非标识关系指定对象之间的常规关联,1:1或1:n基数.
如果父级不是必需的,则可以将非标识关系指定为可选,或者通过设置父表基数,在需要父级的情况下将非标识关系指定为必需关系...
Dan*_*yes 24
比尔的答案是正确的,但令人震惊的是,在所有其他答案中,没有人指出最重要的方面.
一遍又一遍地说,如果没有父母,孩子就不能存在并确定关系.(例如user287724).这是事实,但完全忽略了这一点.只要外键足够非空,就可以实现这一点.它不需要是主键的一部分.
所以这是真正的原因:
识别关系的目的是外键永远不会改变,因为它是主键的一部分... 因此识别!!!
And*_*ite 14
这是一个很好的描述:
两个实体之间的关系可以被分类为"识别"或"非识别".当父实体的主键包含在子实体的主键中时,存在标识关系.另一方面,当父实体的主键包含在子实体中但不作为子实体的主键的一部分时,存在非标识关系.此外,非识别关系可以进一步分类为"强制性"或"非强制性".当子表中的值不能为空时,存在强制的非标识关系.另一方面,当子表中的值可以为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
Run Code Online (Sandbox Code Playgroud)
这是一个相应的非识别关系:
Parent
------
ID (PK)
Name
Child
-----
ID (PK)
ParentID (FK to Parent.ID) -- notice no PK
Name
Run Code Online (Sandbox Code Playgroud)
Acc*_*t م 10
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
Run Code Online (Sandbox Code Playgroud)
在这个例子中,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 , thecountry_id`)以识别每个导入行"如果它们都在同一年"这里两列可以组合子表中的主键(导入)并引用父表.
我很高兴我终于理解了identifying relationship和的概念non identifying relationship,所以请不要告诉我,对于一个完全无效的例子,我所有这些投票都错了
是的,逻辑上一本书没有作者就无法写出,但是一本书可以在没有作者的情况下被识别,实际上它无法与作者一起识别!
您可以100%从书行中删除作者,仍然可以识别该书!.
非识别关系
非识别关系意味着孩子与父母有关,但可以由孩子自己识别.
PERSON ACCOUNT
====== =======
pk(id) pk(id)
name fk(person_id)
balance
Run Code Online (Sandbox Code Playgroud)
ACCOUNT和PERSON之间的关系是不可识别的.
确定关系
识别关系意味着父母需要为孩子提供身份.由于父母,孩子完全存在.
这意味着外键也是主键.
ITEM LANGUAGE ITEM_LANG
==== ======== =========
pk(id) pk(id) pk(fk(item_id))
name name pk(fk(lang_id))
name
Run Code Online (Sandbox Code Playgroud)
ITEM_LANG和ITEM之间的关系正在确定.在ITEM_LANG和LANGUAGE之间也是如此.
如果您认为删除父项时应该删除子项,那么它是一种识别关系。
如果即使删除了父项也应该保留子项,那么它是一种非识别关系。
例如,我有一个包含受训者、培训、文凭和培训课程的培训数据库:
如果删除了相关受训者、培训或文凭之一,则仅应删除培训课程。
| 归档时间: |
|
| 查看次数: |
388811 次 |
| 最近记录: |