从编程角度识别和非识别关系
Identifying and Non-Identifying relationships from programming perspective
所以,我一直在阅读有关数据库设计中识别和非识别关系的问题和答案。
我理解如果一个子行在逻辑上不能在没有其父行的情况下被识别,那么它是一个识别关系。
我已经考虑了一段时间了。从现实生活的逻辑角度来看,这是完全有道理的。但是从数据库引擎的技术角度来看,我不太明白它有什么区别。
那么,如果我将子行定义为 not-null 并为父行创建一个限制性外键,而不是将父行的 id 标识为子行的主键的一部分,这会有什么区别?
在 relational/SQL 数据库中,它没有实际区别。识别/非识别概念存在于 ER 建模中,主要作为解释业务领域语义方面的一种方式,即关于首选识别方式和实体之间强制关系的业务规则。
一些 ER 建模者还存在一种做法,即引用属性(即 "foreign keys")仅在它们也需要用于标识目的(即 "primary key" 属性)时才显示在图表上。当引用是 "non-identifying" 时,理论认为它们是由关系线的存在暗示的,根本不需要在引用实体中显示。现在似乎很少遵守这种约定(至少根据我的经验),但它可以解释为什么会出现所谓的识别关系的重要性。
所以,我一直在阅读有关数据库设计中识别和非识别关系的问题和答案。
我理解如果一个子行在逻辑上不能在没有其父行的情况下被识别,那么它是一个识别关系。
我已经考虑了一段时间了。从现实生活的逻辑角度来看,这是完全有道理的。但是从数据库引擎的技术角度来看,我不太明白它有什么区别。
那么,如果我将子行定义为 not-null 并为父行创建一个限制性外键,而不是将父行的 id 标识为子行的主键的一部分,这会有什么区别?
在 relational/SQL 数据库中,它没有实际区别。识别/非识别概念存在于 ER 建模中,主要作为解释业务领域语义方面的一种方式,即关于首选识别方式和实体之间强制关系的业务规则。
一些 ER 建模者还存在一种做法,即引用属性(即 "foreign keys")仅在它们也需要用于标识目的(即 "primary key" 属性)时才显示在图表上。当引用是 "non-identifying" 时,理论认为它们是由关系线的存在暗示的,根本不需要在引用实体中显示。现在似乎很少遵守这种约定(至少根据我的经验),但它可以解释为什么会出现所谓的识别关系的重要性。