无损连接先问:分开以后还能不能拼回来
无损连接的重点是数据。把一个大关系拆成几个小关系以后,如果通过自然连接能够恢复出原来的关系,并且不会多出莫名其妙的伪元组,就可以说这个分解具有无损连接性。它解决的是“拆表以后信息有没有丢、有没有拼错”的问题。
比如学生选课信息拆成学生表和选课表,如果两张表通过学号连接后能恢复合理数据,这就是我们希望看到的分解效果。反过来,如果拆完之后连接回来多出不存在的组合,说明分解有问题。考试题里出现“能否还原原关系”“是否产生伪元组”,优先想到无损连接。
| 概念 | 关心的问题 | 题干信号 |
|---|---|---|
| 无损连接 | 数据分解后能不能正确连接还原 | 还原原关系、伪元组、信息丢失 |
| 保持函数依赖 | 原来的约束能不能在分解后直接检查 | 依赖是否保留、约束检查 |
| 规范化 | 减少冗余和异常 | 部分依赖、传递依赖、BCNF |
| 反规范化 | 为了查询效率适当增加冗余 | 读多写少、性能权衡 |
保持函数依赖再问:原来的规则还能不能直接看出来
保持函数依赖看的不是能不能把数据拼回去,而是原来关系里的函数依赖,拆表以后是否还能在各个小关系中直接体现。比如原来有 A 决定 B,B 决定 C,分解后如果这些依赖需要把多个表连接起来才能验证,就可能不算很好地保持函数依赖。
这类题不要只凭“分解后的表更多、更规范”来判断。规范化的目标是减少冗余和异常,但一个分解可能满足较高范式,却不一定同时保持所有函数依赖。考试如果问“是否便于检查依赖约束”,方向就已经从数据还原转到规则保持了。
老师常用的判断口径
问能不能拼回原数据,看无损连接。
问原来的函数依赖能不能在分解后的关系中检查,看保持依赖。
问是否消除部分依赖、传递依赖,看范式层次。
两个性质可以同时有,也可以只满足其中一个
有些同学会误以为只要无损连接,就一定保持依赖;或者只要保持依赖,就一定无损连接。这两个性质不是一回事。一个分解可以既无损连接又保持函数依赖,这是最理想的情况;也可能为了达到某种范式,牺牲了依赖保持的便利性。
软考选择题通常不会让你做很复杂的证明,但会考判断方向。你只要先把题干问的是“数据恢复”还是“依赖检查”分清楚,选项就会好排除。遇到 BCNF 和 3NF 的比较时尤其要注意:BCNF 更严格,但不一定总能同时保持依赖。
| 问法 | 应该看什么 | 常见错误 |
|---|---|---|
| 分解后自然连接能否得到原关系 | 无损连接 | 去看是否保持依赖 |
| 原函数依赖是否仍可直接检查 | 保持函数依赖 | 去判断有没有伪元组 |
| 是否消除传递依赖 | 第三范式 | 和无损连接混在一起 |
| 决定因素是否都是候选键 | BCNF | 只记比 3NF 更严格但说不出严格在哪 |
复习建议:把题干翻译成一句普通话
做模式分解题时,先不要急着套公式。把题干翻译成一句普通话:它是在问“拆开后还能不能拼回去”,还是问“拆开后原来的约束还能不能直接维护”。翻译出来以后,再回到函数依赖和候选键去判断。
这类内容看起来抽象,其实很适合用学生、课程、教师、部门这些小例子练。每次分解后都问两件事:数据是否能正确还原,规则是否还能直接检查。坚持这么练几道题,规范化不再只是背 1NF、2NF、3NF 的定义。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 函数依赖中属性闭包怎么求?属性闭包 / 函数依赖
- 软件设计师考试中第三范式主要看什么?数据库设计 / 第三范式
- UML 类图中泛化关系是什么意思?UML 类图关系 / 软件设计师UML类图