3.6.2 规范化理论基本概念-01
本课核心知识点整理
函数依赖是“决定关系”
函数依赖描述属性之间的语义约束。若在关系模式 R 中,任意两个元组只要属性集 X 的值相同,属性集 Y 的值也必然相同,就说 Y 函数依赖于 X,记作:
例如在学生关系中,若学号唯一标识学生,则:
这不是数学函数的计算公式,而是数据库语义:同一个学号不能对应两个不同姓名。
几类依赖的区别
| 依赖类型 | 形式化理解 | 直观判断 | 范式影响 |
|---|---|---|---|
| 平凡函数依赖 | 自己当然能决定自己的一部分 | 通常不作为异常来源 | |
| 非平凡函数依赖 | 决定了集合外的新属性 | 范式判断重点 | |
| 完全函数依赖 | 必须靠整个组合键 | 满足 2NF 所希望的状态 | |
| 部分函数依赖 | 组合键里有一部分多余 | 破坏 2NF | |
| 传递函数依赖 | 通过中间属性间接决定 | 破坏 3NF 的典型原因 |
部分函数依赖只需要在候选键是组合属性时重点检查。单属性候选键没有真子集可用来决定非主属性,因此不会出现“候选键的一部分决定非主属性”的问题。
用例子看部分依赖
设关系:
候选键通常是 {学号, 课程号},因为一名学生选一门课才对应一个成绩。但依赖中可能有:
姓名只依赖组合键的一部分“学号”,课程名只依赖组合键的一部分“课程号”,这就是非主属性对候选键的部分函数依赖。它会导致学生姓名、课程名在多条选课记录中反复出现。
用例子看传递依赖
设关系:
若:
则学号通过专业号间接决定专业名:
专业名并不应该依赖每个学生重复保存,而应由专业号决定。否则一个专业名改名,需要修改所有该专业学生记录。
Armstrong 公理的考试用法
字幕提到 Armstrong 公理体系,软件设计师考试不要求像理论课那样完整证明,但要会用几个推理规则判断依赖能否推出。
| 推理规则 | 形式 | 含义 |
|---|---|---|
| 自反律 | 若 | 属性集能决定自身子集 |
| 增广律 | 若 | 两边加同样属性仍成立 |
| 传递律 | 若 | 决定关系可传递 |
| 合并律 | 若 | 同一决定因素可合并右部 |
| 分解律 | 若 | 右部可拆开 |
做题时最常用的是传递律和分解/合并。比如给出 A -> B、B -> C,就可推出 A -> C;给出 A -> BC,就可推出 A -> B 和 A -> C。
做题路线
- 先把复合右部拆开,便于逐条推理,如
A -> BC可拆为A -> B、A -> C。 - 判断部分依赖时,先确认候选键是否为组合属性,再看其真子集是否能决定非主属性。
- 判断传递依赖时,寻找“候选键 -> 非主属性 -> 非主属性”的链条。
- 不要把“能推出”误认为“是候选键”。候选键还必须能推出全部属性且无冗余。
例题
函数依赖 X -> Y 的含义是:
部分函数依赖通常需要重点检查的情况是:
自查要点
- X -> Y 表示什么?
- 部分函数依赖为什么和组合键关系密切?
- 传递函数依赖通常怎样出现?