关系模式 R(A,B,C) 的函数依赖集 F={AB→C,C→B}。按违反 BCNF 的依赖 C→B,将 R 分解为 R1(C,B) 和 R2(A,C)。该分解具有的性质是()。
R1∩R2={C},且由 C→B 可知 C→R1,因此该二元分解无损。投影到 R1 的依赖含 C→B,投影到 R2 上没有能推出 AB→C 的非平凡依赖;从分解后的依赖并集无法由 AB 推出 C,所以原依赖 AB→C 未被保持。
选项分析
错误。公共属性C能决定R1(C,B),满足二元分解的无损判定条件。
正确。分解无损,但AB→C无法由两个子模式上的投影依赖推出。
错误。两个性质都判断反了。
错误。BCNF分解能保证无损,但并不保证总能保持所有函数依赖,本题正是反例。
本题为什么容易错
不少同学记成‘规范化分解一定无损且保持依赖’。实际上常用的 BCNF 分解算法保证无损连接,却可能牺牲依赖保持;3NF 综合算法更强调保持依赖。
简短答案
R(A,B,C) 分解为 R1(C,B) 和 R2(A,C),为什么无损却不保持依赖,正确答案是 B(无损连接,但不保持函数依赖)。R1∩R2={C},且由 C→B 可知 C→R1,因此该二元分解无损。投影到 R1 的依赖含 C→B,投影到 R2 上没有能推出 AB→C 的非平凡依赖;从分解后的依赖并集无法由 AB 推出 C,所以原依赖 AB→C 未被保持。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 有损连接,且不保持函数依赖 | 本题干扰项 | 错误。公共属性C能决定R1(C,B),满足二元分解的无损判定条件。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 无损连接,但不保持函数依赖 | 本题正确答案 | 正确。分解无损,但AB→C无法由两个子模式上的投影依赖推出。 | 看到题干核心场景时优先联想到它 |
| 有损连接,但保持函数依赖 | 本题干扰项 | 错误。两个性质都判断反了。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 无损连接,且保持全部函数依赖 | 本题干扰项 | 错误。BCNF分解能保证无损,但并不保证总能保持所有函数依赖,本题正是反例。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 有损连接,且不保持函数依赖:错误。公共属性C能决定R1(C,B),满足二元分解的无损判定条件。
- 有损连接,但保持函数依赖:错误。两个性质都判断反了。
- 无损连接,且保持全部函数依赖:错误。BCNF分解能保证无损,但并不保证总能保持所有函数依赖,本题正是反例。
知识点详解
BCNF 要求每个非平凡函数依赖 X→Y 的决定因素 X 都是超键。按违规依赖 X→Y 分解为 XY 与 R-(Y-X),通常可保证无损连接;但原依赖可能跨越子模式,无法仅靠局部约束检查。依赖保持要求分解后各投影依赖的并集与原依赖等价。
备考速记
无损看能否正确拼回,保持依赖看能否局部查约束,两件事分开判。
BCNF 在函数依赖场景中的作用
BCNF在本题中的核心价值,是解决“关系模式 R(A,B,C) 的函数依赖集 F={AB→C,C→B}。按违反 BCNF 的依赖 C→B,将 R 分解为 R1(C,B) 和 R2(A,C)。该分解具有的性质是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 找违反BCNF的函数依赖
- 判断二元分解是否无损
- 比较3NF与BCNF在依赖保持方面的差异
BCNF 在数据库系统工程师软考中的考法
软考选择题通常不会只考概念定义,还会把BCNF放到函数依赖场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
这题一定分两张账。第一张账看连接:公共属性只有 C,而 C 能决定 R1 中的 B,所以拼回去不会乱配。第二张账看约束:C→B 能在 R1 本地检查,但 AB→C 横跨两个子模式,靠各自局部依赖推不回来。因此是无损、不保持依赖。
考点定位
无损连接和依赖保持是两项独立检查。二元分解无损可看公共属性能否函数决定其中一个子模式;依赖保持则要看各子模式投影依赖的并集能否推出原依赖。
易错提醒
- 确认两个子模式都是BCNF后,就直接断定保持依赖
- 只看原依赖是否出现在任一子模式中,没有计算投影依赖的闭包
- 用公共属性非空作为无损充分条件,忘记公共属性还要决定其中一个子模式
备考提示
- 先求候选键:本题 AB 和 AC 都是键,C 不是超键,所以 C→B 违反 BCNF。
- 判断依赖保持时,从原依赖左部 AB 出发,用分解后可检查的依赖做属性闭包。
你可能还想了解
- BCNF分解一定无损吗?
- BCNF分解为什么可能不保持依赖?
- 二元分解无损连接条件是什么?
- 3NF和BCNF哪个更容易保持依赖?
本文小结
公共属性 C 能决定 R1,因此分解无损;但分解后的局部依赖不能推出 AB→C,所以该分解不保持全部函数依赖。