实体完整性
每个元组都应该能够被唯一识别
从异常记录追到标识、引用和业务规则
看到空学号、失效课程号或 Grade=135 时,判断数据库应按哪条规则拒绝
先看能否唯一识别,再查引用的学生或课程是否存在,最后检查成绩等业务值
先判断:Student.Sno=NULL | SC.Cno 不存在于 Course | Grade=135
每个元组都应该能够被唯一识别
关系之间的引用能够找到真实目标
例如成绩在 0—100 之间,订单金额不能为负
关系数据库必须保证主码和外码规则;成绩范围等规则由具体业务补充
主码让每个基本关系元组都能被唯一识别
任意两个元组不能有相同的主码值
主码中的每个主属性都不能取空值
否则无法确定元组代表哪个实体
SC 中的 (Sno, Cno) 共同标识一条选课记录
同一学生同一课程只登记一次;不考虑重修、跨学期重复或多个教学班
| 数据 | 实体完整性 | 原因 |
|---|---|---|
Sno=20180001、Cno=81002 | 满足 | 复合主码完整且可定位元组 |
Sno=NULL、Cno=81002 | 不满足 | 主码属性不能取空值 |
Sno=20180001、Cno=NULL | 不满足 | 主码属性不能取空值 |
两条记录使用相同 Sno 与 Cno | 不满足 | 主码值不能重复 |
SC.Sno 是外码;写入 20180001 时,必须能在 Student.Sno 中找到学生
\(R\) 中对应 \(S.K_s\) 的属性或属性组。\(F\) 本身不是 \(R\) 的完整码,但可以是 \(R\) 复合主码的一部分
保存外码并提出引用的关系
提供被引用主码的目标关系
外码与目标主码应使用同一个域,即使用相同的数据类型和取值范围
外码或者整体为空,或者完整匹配目标关系中已有的主码
\(F\) 的全部属性:或者整体为空,或者等于 \(S\) 中某个元组的完整主码 \(K_s\)
复合外码不能只空其中一部分
外码不能指向一个不存在的对象
一条选课记录必须能够找到对应的学生和课程
| 参照关系 | 外码 \(F\)(在 SC 中的身份) | 被参照关系及主码 \(K_s\) |
|---|---|---|
SC | Sno:外码,也是 SC 复合主码属性 | Student.Sno |
SC | Cno:外码,也是 SC 复合主码属性 | Course.Cno |
复合主码时,若复合主码中的属性还分别是单属性外码,则都不能取空值
课程的先修课用 Cpno 引用同一个 Course 关系的 Cno
| 关系角色 | 关系 | 属性 |
|---|---|---|
| 参照关系 | Course | Cpno 是外码 |
| 被参照关系 | Course | Cno 是主码 |
| 合法取值 | Course | 空值或已有课程号 |
参照关系和被参照关系可以是同一关系;规则仍是“空值或已有主码值”
即使学生和课程都存在,Grade=135 仍应被成绩范围规则拒绝
成绩必须在 0—100 之间,订单金额不能为负
学生姓名或订单创建时间不能为空
业务编号或其他特定属性不能重复;它不等同于主码唯一性
用户定义完整性在实体、参照完整性之外,补充具体业务规则
先找出异常,再判断它违反实体、参照还是用户定义完整性
| 异常数据 | 类型 | 判断依据 |
|---|---|---|
两个 Student 使用同一 Sno | 实体完整性 | 主码值重复 |
Student 的 Sno 为空 | 实体完整性 | 主属性不能取空值 |
SC 的 Cno 不存在于 Course | 参照完整性 | 外码无对应主码 |
Course 的 Cpno 不存在于 Course | 参照完整性 | 自引用目标不存在 |
Grade=135 | 用户定义完整性 | 违反成绩范围规则 |
| 复合外码只空其中一项 | 参照完整性 | 外码不能部分为空 |
OrderNo 不能空或重复;明细必须找到订单和商品;金额与支付状态也要合规
Order(OrderNo, ...) 中 OrderNo 是主码;OrderItem.OrderNo 外码参照 Order.OrderNo,OrderItem.ProductNo 外码参照 Product.ProductNo
OrderNo 为空或重复,无法唯一识别订单
OrderItem 引用不存在的订单或商品
订单金额为负或支付状态不是规定值
关键规则应由数据库统一检查
任选订单或玩家资产数据,不看前页分类,按标识、引用、业务规则逐项检查
找出主码为空或重复的记录,并说明为什么它无法代表一个可区分对象(实体或联系)
从外码走到目标主码,检查外码是整体为空还是完整匹配;自引用也必须找到本关系中已有的主码
检查范围、非空和业务唯一性,并说明这条规则为何不能由主码或外码自动推出
分析每条异常应被哪一类约束拒绝,以及阻止了哪种不可能或相互矛盾的记录
Student.Sno=NULL、SC.Cno=99999、SC.Grade=135 分别违反哪类完整性?OrderItem 的 OrderNo、ProductNo 分别指向哪里?