我还不能完全理解这些差异。你能描述这两个概念并使用真实世界的例子吗?
当前回答
订单处理就是一个很好的例子。来自客户的订单通常有一个用于标识订单的订单号、每个订单出现一次的一些数据(如订单日期和客户ID)以及一系列行项目。每个行项目包含一个项目编号,用于标识订单中的行项目、订购的产品、该产品的数量、产品的价格以及行项目的金额,可以通过将数量乘以价格来计算。
标识行项目的编号仅在单个订单的上下文中标识行项目。每个订单中的第一行项目是项目编号“1”。行项目的完整标识是项目编号及其所属的订单编号。
因此,订单和行项目之间的父子关系是一种识别关系。ER建模中一个密切相关的概念叫做“子实体”,其中行项目是订单的子实体。通常,子实体与其从属实体具有强制的子-父标识关系。
在经典的数据库设计中,LineItems表的主键是(OrderNumber,ItemNumber)。今天的一些设计者会给一个项目一个单独的ItemID,它作为主键,并由DBMS自动递增。在这种情况下,我推荐经典设计。
其他回答
识别关系意味着子实体完全依赖于父实体的存在。
示例帐户表人员表和人员帐户。人员帐户表仅通过帐户和人员表的存在来标识。
非标识关系意味着父表的存在不标识子表。
示例accountType和account.accountType表未标识为存在科目表。
如果您认为在删除父项时应删除子项,则这是一种识别关系。
如果即使父项已删除,子项仍应保留,则它是一个不可识别的关系。
例如,我有一个包含学员、培训、文凭和培训课程的培训数据库:
学员与培训课程有明确的关系培训与培训课程有明确的关系但学员与文凭的关系并不明确
如果删除了相关的学员、培训或文凭,则只应删除培训课程。
这里有一个很好的描述:
两个实体之间的关系可分为“识别”或“非识别”。当父实体的主键包含在子实体的主键中时,存在识别关系。另一方面,当父实体的主键包含在子实体中但不作为子实体主键的一部分时,存在非标识关系。此外,不可识别的关系可进一步分类为“强制性”或“非强制性”。当子表中的值不能为空时,存在强制的非标识关系。另一方面,当子表中的值可以为空时,存在非强制的非标识关系。
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
从父级迁移到子级的属性是否有助于识别子级?
如果是:标识依赖性存在,则关系是标识的,子实体是“弱”的。如果不存在:标识依赖不存在,则关系是非标识的,子实体“强”。
注意,身份依赖意味着存在依赖,但并非相反。每一个非NULL FK都意味着没有父级就不能存在子级,但这并不能使关系确定。
有关这方面的更多信息(以及一些示例),请参阅ERwin方法指南的“确定关系”部分。
补充:我意识到我参加聚会(非常)晚了,但我觉得其他答案要么不完全准确(用存在依赖而不是身份依赖来定义它),要么有些曲折。希望这个答案更清晰。。。
1孩子的FK是孩子的PRIMARY KEY或(非NULL)UNIQUE约束的一部分。
比尔的回答是正确的,但令人震惊的是,在所有其他答案中,没有人指出最重要的方面。
人们一再强调,在一种确定的关系中,没有父母,孩子是不可能存在的。(例如用户287724)。这是真的,但完全没有抓住重点。外键为非空就足够了。它不需要是主键的一部分。
因此,真正的原因是:
识别关系的目的是,外键永远不会更改,因为它是主键的一部分。。。因此识别!!!
推荐文章
- 数据库和模式的区别
- 如何从命令行在windows中找到mysql数据目录
- 货币应该使用哪种数据类型?
- 如何找到MySQL的根密码
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 什么是分片,为什么它很重要?
- 数据库触发器是必要的吗?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?
- 关于数据库,每个开发人员应该知道些什么?
- "where 1=1"语句
- 是使用各有一个模式的多个数据库更好,还是使用一个数据库有多个模式更好?
- 如何从Oracle的表中获取列名?