彻底聊聊关系数据库中的完整性约束:实体完整性、参照完整性和用户定义的完整性

1、结论描述

先用最简单的话总结一下,实体、参照和用户定义的完整性,避免理论性的论述性的内容过长过繁。

  • 实体完整性:是用来唯一标识实体的要求(即现实世界中唯一存在的一个事物、人或个体)。不能为空,需要唯一确认,表示的是这一条记录的实体的完整唯一,通常用主键描述,不能为空且不重复。

  • 参照完整性:它表示的是两个关系之间的联系,是表与表之间的引用。对应的就是外键,外键约束实现参照完整性。

外码(外键)要么取空值,要么取引用的表的主码(主键)值,或码的值。

  • 用户定义的完整性:这是针对某个具体的业务、特定的实际需求而定义的,关系中的属性需要满足的条件或取值范围等。即数据库管理系统提供并实现由用户自己定义的某个完整性。

2、完整性介绍 

数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。

数据完整性(Data Integrity)保证的是数据的精确(Accuracy)和可靠性(Reliability)。

正确和相容(外键约束)

数据完整性主要分三类:

  • 实体完整性

  • 参照完整性

  • 用户定义的完整性

就是根据定义的一组(多个)规则,RDBMS实现对数据完整性的保证。

实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称为关系的两个不变性,应该由关系系统自动支持。

用户定义的完整性是应用领域需要遵循的约束条件,体现的是具体领域、具体业务和需求场景中要满足的约束。

3、实体完整性(Entity Integrity)

实体代表了现实世界中实际存在事、物、人或抽象的概念。

这就要求实体是客观存在的,是可分辨可区分的。比如现实中的两个学生,是可区分的,这是两个不同的个体;两个相同型号的手机,也是可分辨的两个不同的物体。

当将两个学生、两个手机不同的客体的相关数据,从现实空间映射到数据空间时,就是两条记录。这两条记录也应该是可区分的。

如何区分关系中的两个实体或两个记录?是通过关系的码。

实体的完整性,就是对关系的码做出要求,即不能取空值。

关系的主属性不能取空值。必须是确定的唯一的值,否则无法区分两条记录。

空值,NULL,在数据库中表示一种特殊值,它表示“不知道”或“不确定”或“无意义,不存在”的特殊状态。

由于“不知道”、“不确定”,所有任何值和NULL进行操作的结果都是NULL,都是不确定。

  • 举例

比如"选修"关系中:选修(学号,课程号,成绩)。

“学号、课程号”为主码,这两个属性都不能取空值。

4、参照完整性

(1)参照完整性

参照完整性指的是关系与关系之间的联系,即表与表之间的联系,通常对应表中的外键约束或外键引用。

通过关系中属性的值(即列的值)来关联不同的关系实体。

  • 比如:专业实体、学生实体及它们之间一对多的联系。

学生(学号,姓名,性别,专业号,年龄)学生(学号,姓名,性别,专业号,年龄)

专业(专业号,专业名)专业(专业号,专业名)

学生关系引用了专业关系的主码“专业号”;学生关系中的“专业号”的值必须是确实存在的专业的“专业号”。

  • 再比如:学生、课程、学生与课程之间的多对多联系

学生(学号,姓名,性别,专业号,年龄)学生(学号,姓名,性别,专业号,年龄)

课程(课程号,课程名,学分)课程(课程号,课程名,学分)

选修(学号,课程号,成绩)选修(学号,课程号,成绩)

  • 再比如:学生实体及其内部的一对多联系

学生(学号,姓名,性别,专业号,年龄,班长)学生(学号,姓名,性别,专业号,年龄,班长)

“学号”是主码,“班长”是外码,它引用了本关系的“学号”。

“班长” 必须是确实存在的学生的学号。

(2)外码(Foreign Key)

外码对应数据库中表的外键。

设 FF 是基本关系 RR 的一个或一组属性,但不是关系 RR 的码。

如果 FF与基本关系 SS 的主码 K_sKs 相对应,则称 FF 是 RR 的外码。

如此:基本关系 RR 称为参照关系(Referencing Relation),基本关系 SS 称为被参照关系(Referenced Relation)或目标关系(Target Relation)

自引用的属性也是外码。比如学生中的“班长”与“学号”对应。“班长”是外码;学生关系既是参照关系也是被参照关系。

外码并不一定要与相应的主码同名。不是自引用的参照完整性,通常外码与主码都会取相同的名字,便于识别。

(3)参照完整性的规则

若属性(或属性组) FF 是基本关系R的外码,它与基本关系S的主码 K_sKs 相对应,则对于R中每个元组在F上的值必须为:

  • 或者取空值(F的每个属性值均为空值)

  • 或者等于S中某个元组的主码值

也就是,外码(外键)要么取空值,要么取引用的表的主码(主键)值,或码的值

现代RDBMS中,外键通常也都支持引用表的码属性,而不一定是主键,比如唯一约束的列。

外码(外键)可以去空值的原因在于,它并不用于区分标识实体的唯一,不用于区分不同的实体,取空值不影响实体完整性。空值表示参照关系中的这个元组(实体)在外码(外键)属性上的值暂时未知,即字段值未知的状态。

  • 举例

学生关系中每个元组的“专业号”属性只取两类值:

(1)空值,表示尚未给该学生分配专业

(2)非空值,这时该值必须是专业关系中某个元组的“专 业号”值,即该学生不可能分配一个不存在的专业。

5、用户定义的完整性

用户定义的完整性,针对的是某一个具体使用的数据库中的约束条件。反映的是具体应用、具体业务或场景,涉及的数据必须满足的要求。

这类约束的实现,可以放在应用层完成检查校验;也可以由关系数据库管理系统,提供对这类完整性定义、实现和检验的机制,由数据库系统层统一管理和处理,减少应用程序的负担。

实体完整性(主键)和参照完整性(外键)约束,也都是由数据库系统层提供的约束机制

  • 举例:

课程(课程号,课程名,学分)课程(课程号,课程名,学分)

非主属性“课程名”不能取空值,且是唯一值。“学分”属性只能取值{1,2,3,4}

参考

主要参考自《数据库系统概论(基础篇)》


作者:代码迷途
链接:https://juejin.cn/post/7001652363094294535
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

架构PDF完整版是指一个包含了全面且详细架构设计的PDF文档。在软件开发和系统设计,架构设计是非常重要的一部分,它涉及到如何组织和设计软件系统的各个组件和模块,以及它们之间的关系和交互。 架构PDF完整版主要包括以下几个方面的内容: 1. 系统概述:介绍整个系统的目标和范围,以及系统所需要解决的问题和应用场景。这部分内容一般会包括业务需求和用户需求的分析,以及系统的功能和非功能需求的说明。 2. 架构目标和原则:说明系统架构设计所要遵循的目标和原则,例如可扩展性、可维护性、性能和安全性等。这些目标和原则是指导架构设计工作的重要准则,确保系统能够满足用户的需求并具备可持续发展的能力。 3. 架构设计:详细描述系统各个组件和模块的功能和责任,并展示它们之间的关系和交互。架构设计一般包括系统的分层结构、组件的选择和划分、数据流和控制流的设计等内容。 4. 接口设计:说明系统各个组件之间的接口规范和通信方式。接口设计要考虑到组件之间的数据交换和消息传递,确保系统的各个部分能够协调工作并实现预期的功能。 5. 部署和扩展策略:描述系统的部署架构和扩展性设计。部署策略包括系统的部署拓扑和硬件配置,扩展策略包括如何添加新的功能和处理更大的负载。 架构PDF完整版对于软件开发团队和项目管理者来说非常重要,它可以作为项目的基础文档,为团队成员提供清晰的开发方向和实施指南。同时,架构PDF完整版也可以作为系统演进和维护的参考,帮助团队更好地理解和改进现有系统。 总的来说,架构PDF完整版是一个系统设计的重要文档,它包含了系统设计的方方面面,对于软件开发和系统设计来说具有很大的价值和意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值