3.6.7 模式分解-02
本课核心知识点整理
保持函数依赖关注“约束还能不能检查”
无损连接关注数据能否还原,保持函数依赖关注原来的约束是否还能在分解后的关系中表达和检查。两者是不同维度,考试常把它们组合起来问。
若原关系上的函数依赖集是
则分解保持函数依赖。直观地说,原来该检查的约束,在拆表之后仍然能检查出来。
保持依赖与无损连接的区别
| 判断维度 | 问题 | 失败后果 |
|---|---|---|
| 无损连接 | 拆开后还能不能自然连接回原关系 | 数据对应关系丢失或产生伪元组 |
| 保持函数依赖 | 原函数依赖还能不能由子关系中的依赖推出 | 约束需要跨表连接才能检查,甚至丢失 |
| 范式级别 | 拆分后是否减少部分/传递依赖 | 冗余和异常仍然存在 |
一个分解可能无损但不保持依赖,也可能保持依赖但仍要单独验证是否无损。因此不要看到“能还原”就自动认为“保持依赖”。
例子:分解选项为什么不能只看表少不少
字幕中的元件例子可以整理为:
函数依赖:
候选键是 {元件号, 供应商号}。元件名称 只依赖 元件号,供应商所在地 只依赖 供应商号,二者都是对组合候选键的部分依赖,所以原模式最高只有 1NF。
合理分解应至少拆出:
这样既消除了部分依赖,又保留了关键依赖 元件号, 供应商号 -> 库存量。如果某个选项把 库存量 与 元件号/供应商号 的组合关系拆散,就会丢失这一业务约束,也无法可靠还原某供应商对某元件的库存量。
分解后的范式判断
上面的三个子关系都比较干净:
| 子关系 | 候选键 | 主要依赖 | 范式直观判断 |
|---|---|---|---|
| 元件(元件号, 元件名称) | 元件号 | 元件号 -> 元件名称 | 单属性键,无传递依赖 |
| 库存(元件号, 供应商号, 库存量) | 元件号 + 供应商号 | 组合键 -> 库存量 | 非主属性完全依赖组合键 |
| 供应商(供应商号, 供应商所在地) | 供应商号 | 供应商号 -> 供应商所在地 | 单属性键,无传递依赖 |
如果题目选项给到 BCNF,这类每个决定因素都是候选键的子关系通常也可达到 BCNF。若题目只问 2NF/3NF,则按范式递进判断即可。
关于 4NF 的边界
字幕提醒第 4 范式主要涉及多值依赖,通常用双箭头表示。软件设计师考试中,一般不把 4NF 作为本章重点;如果选项突然出现 4NF,要先确认题干是否给了多值依赖。没有多值依赖材料时,不要把普通函数依赖题硬推到 4NF。
模式分解综合题路线
- 求候选键,判断原关系最高范式。
- 找造成低范式的依赖:部分依赖或传递依赖。
- 按依赖拆表,保证每个子关系围绕一个清晰主题。
- 检查无损连接:公共属性能否决定某个子模式。
- 检查保持依赖:原函数依赖能否由分解后的依赖推出。
- 在选项题中,先排除仍保留明显部分依赖/传递依赖的选项,再排除丢失关键业务依赖或无法还原的选项。
例题
保持函数依赖的含义是:
无损连接和保持函数依赖的关系是:
自查要点
- 保持函数依赖关注的是什么?
- 无损连接和保持依赖为什么不能混淆?
- 一个分解是否合理通常要检查哪几个方面?