数据库规范化 · 模式分解 · 无损连接

无损连接和保持函数依赖怎么区分?

关系模式分解题里,有两个词很像,但考点完全不同:无损连接和保持函数依赖。老师讲这块时通常会先把问题翻译成人话:无损连接关心分解以后还能不能拼回原来的数据;保持函数依赖关心原来的约束能不能在分解后的表里直接检查。一个看数据能不能还原,一个看规则能不能保留。

数据库系统工程师专题 软考题库编辑部 持续更新

无损连接先问:分开以后还能不能拼回来

无损连接的重点是数据。把一个大关系拆成几个小关系以后,如果通过自然连接能够恢复出原来的关系,并且不会多出莫名其妙的伪元组,就可以说这个分解具有无损连接性。它解决的是“拆表以后信息有没有丢、有没有拼错”的问题。

比如学生选课信息拆成学生表和选课表,如果两张表通过学号连接后能恢复合理数据,这就是我们希望看到的分解效果。反过来,如果拆完之后连接回来多出不存在的组合,说明分解有问题。考试题里出现“能否还原原关系”“是否产生伪元组”,优先想到无损连接。

概念关心的问题题干信号
无损连接数据分解后能不能正确连接还原还原原关系、伪元组、信息丢失
保持函数依赖原来的约束能不能在分解后直接检查依赖是否保留、约束检查
规范化减少冗余和异常部分依赖、传递依赖、BCNF
反规范化为了查询效率适当增加冗余读多写少、性能权衡

保持函数依赖再问:原来的规则还能不能直接看出来

保持函数依赖看的不是能不能把数据拼回去,而是原来关系里的函数依赖,拆表以后是否还能在各个小关系中直接体现。比如原来有 A 决定 B,B 决定 C,分解后如果这些依赖需要把多个表连接起来才能验证,就可能不算很好地保持函数依赖。

这类题不要只凭“分解后的表更多、更规范”来判断。规范化的目标是减少冗余和异常,但一个分解可能满足较高范式,却不一定同时保持所有函数依赖。考试如果问“是否便于检查依赖约束”,方向就已经从数据还原转到规则保持了。

老师常用的判断口径

问能不能拼回原数据,看无损连接。

问原来的函数依赖能不能在分解后的关系中检查,看保持依赖。

问是否消除部分依赖、传递依赖,看范式层次。

两个性质可以同时有,也可以只满足其中一个

有些同学会误以为只要无损连接,就一定保持依赖;或者只要保持依赖,就一定无损连接。这两个性质不是一回事。一个分解可以既无损连接又保持函数依赖,这是最理想的情况;也可能为了达到某种范式,牺牲了依赖保持的便利性。

软考选择题通常不会让你做很复杂的证明,但会考判断方向。你只要先把题干问的是“数据恢复”还是“依赖检查”分清楚,选项就会好排除。遇到 BCNF 和 3NF 的比较时尤其要注意:BCNF 更严格,但不一定总能同时保持依赖。

问法应该看什么常见错误
分解后自然连接能否得到原关系无损连接去看是否保持依赖
原函数依赖是否仍可直接检查保持函数依赖去判断有没有伪元组
是否消除传递依赖第三范式和无损连接混在一起
决定因素是否都是候选键BCNF只记比 3NF 更严格但说不出严格在哪

复习建议:把题干翻译成一句普通话

做模式分解题时,先不要急着套公式。把题干翻译成一句普通话:它是在问“拆开后还能不能拼回去”,还是问“拆开后原来的约束还能不能直接维护”。翻译出来以后,再回到函数依赖和候选键去判断。

这类内容看起来抽象,其实很适合用学生、课程、教师、部门这些小例子练。每次分解后都问两件事:数据是否能正确还原,规则是否还能直接检查。坚持这么练几道题,规范化不再只是背 1NF、2NF、3NF 的定义。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。