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

愿天堂没有BUG

共 2672字,需浏览 6分钟

 ·

2021-09-02 04:07

结论描述

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

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

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

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

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

完整性介绍

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

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

正确和相容(外键约束)

数据完整性主要分三类:

  • 实体完整性

  • 参照完整性

  • 用户定义的完整性

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

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

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

实体完整性(Entity Integrity)

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

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

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

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

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

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

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

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

  • 举例

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

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

参照完整性

参照完整性

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

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

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

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

专业(专业号,专业名)

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

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

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

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

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

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

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

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

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

外码(Foreign Key)

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

F 是基本关系 R 的一个或一组属性,但不是关系 R 的码。

如果 F与基本关系 S 的主码 K_s 相对应,则称 FR 的外码。

  • 基本关系 R 称为参照关系(Referencing Relation)

  • 基本关系 S 称为被参照关系(Referenced Relation)或目标关系(Target Relation)

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

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

参照完整性的规则

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

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

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

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

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

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

  • 举例

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

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

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

用户定义的完整性

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

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

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

  • 举例:

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

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

参考

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


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



浏览 396
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报