请使用支持现代 CSS 与 JavaScript 的浏览器播放课件
DBPA · 2.3

关系的完整性

从异常记录追到标识、引用和业务规则

VER. 2608 Built with impress.js

学习目标

看到空学号、失效课程号或 Grade=135 时,判断数据库应按哪条规则拒绝

  1. 01根据空学号、失效课程号和越界成绩判断三类完整性约束
  2. 02解释主码为什么必须唯一,且主码中的每个属性都不能取空值
  3. 03沿一条引用识别外码、参照关系和被参照关系
  4. 04用“整体为空或完整匹配已有主码值”检查普通外码、复合外码和自引用
  5. 05区分主码、外码的通用规则与“成绩 0—100”等业务规则,并说明规则只写在某个应用中会造成什么不一致
2/15
LEARNING OBJECTIVES

写入或修改后,三类规则都必须成立

先看能否唯一识别,再查引用的学生或课程是否存在,最后检查成绩等业务值

先判断:Student.Sno=NULL | SC.Cno 不存在于 Course | Grade=135

实体完整性

每个元组都应该能够被唯一识别

参照完整性

关系之间的引用能够找到真实目标

用户定义完整性

例如成绩在 0—100 之间,订单金额不能为负

Takeaway

关系数据库必须保证主码和外码规则;成绩范围等规则由具体业务补充

3/15
INTEGRITY CONSTRAINTS

实体完整性:每个学生都必须可识别

主码让每个基本关系元组都能被唯一识别

唯一

任意两个元组不能有相同的主码值

非空

主码中的每个主属性都不能取空值

结果

否则无法确定元组代表哪个实体

4/15
ENTITY INTEGRITY

复合主码的每个属性都不能取空值

SC 中的 (Sno, Cno) 共同标识一条选课记录

同一学生同一课程只登记一次;不考虑重修、跨学期重复或多个教学班

数据实体完整性原因
Sno=20180001Cno=81002满足复合主码完整且可定位元组
Sno=NULLCno=81002不满足主码属性不能取空值
Sno=20180001Cno=NULL不满足主码属性不能取空值
两条记录使用相同 SnoCno不满足主码值不能重复
5/15
COMPOSITE KEY

先画出引用:SC.Sno → Student.Sno

SC.Sno 是外码;写入 20180001 时,必须能在 Student.Sno 中找到学生

外码 \(F\)

\(R\) 中对应 \(S.K_s\) 的属性或属性组。\(F\) 本身不是 \(R\) 的完整码,但可以是 \(R\) 复合主码的一部分

参照关系 \(R\)

保存外码并提出引用的关系

被参照关系 \(S\)

提供被引用主码的目标关系

Takeaway

外码与目标主码应使用同一个域,即使用相同的数据类型和取值范围

6/15
FOREIGN KEY

写入 SC 前,先确认学生和课程真实存在

外码或者整体为空,或者完整匹配目标关系中已有的主码

\(F\) 的全部属性:或者整体为空,或者等于 \(S\) 中某个元组的完整主码 \(K_s\)

复合外码不能只空其中一部分

Takeaway

外码不能指向一个不存在的对象

7/15
REFERENTIAL RULE

SC 同时参照 Student 与 Course

一条选课记录必须能够找到对应的学生和课程

参照关系外码 \(F\)(在 SC 中的身份)被参照关系及主码 \(K_s\)
SCSno:外码,也是 SC 复合主码属性Student.Sno
SCCno:外码,也是 SC 复合主码属性Course.Cno
Takeaway

复合主码时,若复合主码中的属性还分别是单属性外码,则都不能取空值

8/15
STUDENT COURSE REFERENCE

一个关系也可以引用自身

课程的先修课用 Cpno 引用同一个 Course 关系的 Cno

关系角色关系属性
参照关系CourseCpno 是外码
被参照关系CourseCno 是主码
合法取值Course空值或已有课程号
Takeaway

参照关系和被参照关系可以是同一关系;规则仍是“空值或已有主码值”

9/15
SELF REFERENCE

成绩 135 超出业务规则范围

即使学生和课程都存在,Grade=135 仍应被成绩范围规则拒绝

取值范围

成绩必须在 0—100 之间,订单金额不能为负

非空要求

学生姓名或订单创建时间不能为空

非主码属性的业务唯一性

业务编号或其他特定属性不能重复;它不等同于主码唯一性

Takeaway

用户定义完整性在实体、参照完整性之外,补充具体业务规则

10/15
USER DEFINED INTEGRITY

示例:从异常数据定位完整性约束

先找出异常,再判断它违反实体、参照还是用户定义完整性

异常数据类型判断依据
两个 Student 使用同一 Sno实体完整性主码值重复
StudentSno 为空实体完整性主属性不能取空值
SCCno 不存在于 Course参照完整性外码无对应主码
CourseCpno 不存在于 Course参照完整性自引用目标不存在
Grade=135用户定义完整性违反成绩范围规则
复合外码只空其中一项参照完整性外码不能部分为空
11/15
INTEGRITY DIAGNOSIS

订单系统中的三类完整性错误

OrderNo 不能空或重复;明细必须找到订单和商品;金额与支付状态也要合规

Order(OrderNo, ...)OrderNo 是主码;OrderItem.OrderNo 外码参照 Order.OrderNoOrderItem.ProductNo 外码参照 Product.ProductNo

对象不明

OrderNo 为空或重复,无法唯一识别订单

引用断裂

OrderItem 引用不存在的订单或商品

业务越界

订单金额为负或支付状态不是规定值

Takeaway

关键规则应由数据库统一检查

12/15
CASE JUDGMENT

练习:诊断一组新的异常记录

任选订单或玩家资产数据,不看前页分类,按标识、引用、业务规则逐项检查

查标识

找出主码为空或重复的记录,并说明为什么它无法代表一个可区分对象(实体或联系)

看引用

从外码走到目标主码,检查外码是整体为空还是完整匹配;自引用也必须找到本关系中已有的主码

查业务规则

检查范围、非空和业务唯一性,并说明这条规则为何不能由主码或外码自动推出

Takeaway

分析每条异常应被哪一类约束拒绝,以及阻止了哪种不可能或相互矛盾的记录

13/15
SECTION REVIEW

本节思维导图

14/15
KNOWLEDGE MAP

本节问题

  1. 01Student.Sno=NULLSC.Cno=99999SC.Grade=135 分别违反哪类完整性?
  2. 02主码为什么必须唯一,且所有主属性都不能取空值?
  3. 03\(R\) 保存外码 \(F\)、\(S\) 提供主码 \(K_s\):两关系各是什么角色,\(F\) 需满足哪些同域和取值条件?复合外码为何不能部分为空?
  4. 04OrderItemOrderNoProductNo 分别指向哪里?
  5. 05用户定义完整性为何不能替代实体与参照完整性?
15/15
SECTION QUESTIONS