候选码与超码
候选码决定全部属性且不可再约简;超码包含某个候选码
从数据语义识别依赖,减少关系模式异常
函数依赖把业务语义连接到范式判断,规范化再用分解减少冗余和异常
这个模式把学生、学院和选课事实放在一起,因此同一事实会在多行重复
| 异常 | 事实混合 | 结果 |
|---|---|---|
| 冗余 | 学生、学院和选课 | 院长信息重复 |
| 插入 | 只有学院没有学生 | 大关系没有独立学院事实的存放位置 |
| 删除 | 删除最后一个学生 | 学院信息一起丢失 |
| 更新 | 更换院长 | 需要修改大量重复行 |
对 R(U,F) 的任意可能实例,若两个元组在 X 上相同,它们在 Y 上也必须相同
X 是决定因素;Y⊆X 时为平凡依赖,否则为非平凡依赖;函数依赖属于模式语义,不能只凭当前表无冲突就断言成立
先找码,再标出主属性与非主属性,最后判断依赖类型
候选码决定全部属性且不可再约简;超码包含某个候选码
出现在任一候选码中的是主属性,其余为非主属性
不能删去决定因素中的任何属性
依赖组合码的一部分,或经中间属性间接依赖码
本例候选码:(Sno,Cno);非主属性:School、Mname、Grade
规范化用分解分开多个概念;是否无损连接还需要单独证明
4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF
层级逐步收紧;高范式同时满足较低范式
| 范式 | 主要消除 | 记忆入口 |
|---|---|---|
| 1NF | 非原子分量 | 每个分量是原子值 |
| 2NF | 部分函数依赖 | 非主属性完全依赖候选码 |
| 3NF | 非主属性传递依赖 | 非主属性不传递依赖候选码;主属性被非码决定仍可能允许 |
| BCNF | 非码决定因素 | 每个决定因素都包含某个候选码 |
| 4NF | 非平凡多值依赖 | 多值依赖的决定因素包含某个候选码 |
候选码是 (Sno,Cno);School、Sloc、Grade 是非主属性
| 依赖 | 判断 | 原因/分解方向 |
|---|---|---|
(Sno, Cno) → Grade | 完全依赖 | Sno、Cno 都不能单独决定 Grade;留在 SC |
(Sno,Cno) 对 School | 部分依赖 | 因为 Sno→School;移到 S-L |
(Sno,Cno) 对 Sloc | 部分依赖 | 因为 Sno→Sloc;移到 S-L |
2NF 分解为 SC(Sno,Cno,Grade) 与 S-L(Sno,School,Sloc);S-L 的候选码是 Sno
在 S-L(Sno,School,Sloc) 中,Sno 是候选码,Sloc 是非主属性
S-L(Sno, School, Sloc) 重复学院与宿舍信息
S-SS(Sno, School) 与 S-SL(School, Sloc) 各自描述一个事实
STJ(S,T,J) 让 3NF 与 BCNF 的差异变得具体
| 判断 | 3NF | BCNF |
|---|---|---|
检查 T → J | J 是主属性,可以接受 | T 不是超码,不能接受 |
| 关注对象 | 非主属性对码的依赖 | 所有非平凡函数依赖 |
| 结果 | 可能仍有异常 | 函数依赖范围内更彻底分离 |
T→J 满足 3NF 但违反 BCNF;可分解为 ST(S,T) 与 TJ(T,J),还需要另外验证无损连接和依赖保持
当教师集合与参考书集合彼此独立时,Teaching 会产生组合冗余
在完整关系 Teaching(Course,Teacher,Book) 上,Course→→Teacher 与 Course→→Book 表示两个值集合彼此独立;它们不是“Course 唯一决定一个教师”的函数依赖
4NF 把独立事实拆到各自关系中,并要求先明确全码和多值依赖的决定因素
| 原关系或操作 | 问题 | 分解后的效果 |
|---|---|---|
Teaching(Course, Teacher, Book) | BCNF 可通过,但 Course→→Teacher 使 4NF 不通过 | CourseTeacher + CourseBook |
| 同一课程增加教师 | 需要为每本书插入一行 | 只在 CourseTeacher 增加一行 |
| 删除一本书 | 可能误删教师事实 | 只删除 CourseBook 中的一行 |
分解为 CourseTeacher(Course,Teacher) 与 CourseBook(Course,Book);多值依赖只在给定完整关系模式时讨论
规范化评价还要同时考虑依赖保持和无损连接,不能只看范式等级
同一业务事实尽量只维护一处,减少冗余和更新异常
常用查询可能需要更多连接,读取路径和调优成本会增加
先守住一致性与异常边界,再结合业务、访问路径与运行环境取舍
属性闭包、依赖保持和无损连接可以继续验证分解结果
规范化根据依赖语义把混合事实分解为边界更清晰的关系模式
先从业务事实写出函数依赖,再找候选码、主属性和非主属性
2NF 和 3NF 分别定位部分依赖与非主属性传递依赖
BCNF 识别非码决定因素,4NF 识别独立多值事实
分解可以减少异常,但可能增加连接;依赖保持与无损连接还需要单独验证
属性闭包、依赖保持和无损连接准则可以继续验证设计
(Sno,Cno)→Grade 与 (Sno,Cno) 对 School 的依赖类型?Sno→School→Sloc 为什么是传递依赖,S-L 为什么不满足 3NF?(S,J)、(S,T) 两个候选码,解释为什么 3NF 可接受而 BCNF 不接受 T→J?