知识卡片
无损分解与保持函数依赖是分解质量的两个独立维度
内容
把一张表按范式要求拆成多张表后,怎么判断这次拆分是”好”的?答案不是 单一标准,而是两个互相独立、缺一不可的维度。无损分解要求:拆开的多 张表通过自然连接重新拼接后,能够精确还原原表的数据,不多不少—— 判定的充要条件很简洁:两张子表的公共属性必须是其中至少一张子表的 超码(这样连接时才能保证不会产生原表里不存在的”幽灵组合”)。这是 分解能否安全使用的底线:如果连接后凭空多出了原本不存在的行,说明 拆分丢失了信息,这种分解不管范式级别多高都不能用。保持函数依赖要求: 原表上成立的每一条函数依赖,都还能在某一张子表内部单独验证成立,不 需要跨表连接才能验证——如果一条原本成立的约束,分解后必须先把多张 表连接起来才能检查是否违反,那么这条约束在物理层面就变成”无法直接 靠某张表的主码/唯一性索引保证”,容易被绕过。这两个维度互相独立:一次 分解可以是无损的但不保持函数依赖,也可以两者都满足——书中结论是 “规范化到3NF能同时保证无损分解又保持函数依赖,但规范化到BCNF或 4NF时,得到的分解不再能保证保持函数依赖”,这也是”要不要把规范化 程度推到BCNF”这个决策背后真正的权衡所在。
结构图:
flowchart LR
A[模式分解质量评估] --> B[无损分解<br/>连接后能精确还原原表数据<br/>不能丢失/不能多余]
A --> C[保持函数依赖<br/>原有约束能在单张子表内验证<br/>不需要跨表连接检查]
B --> D{两者关系}
C --> D
D --> E["3NF: 可同时满足两者"]
D --> F["BCNF/4NF: 无损分解仍可保证<br/>但保持函数依赖不再能保证"]
参考来源
- 位置:《数据库原理(微课版)》第7章《关系数据库规范化理论》7.3.2节
"模式分解的概念"(源文件:_epub-src/index_split_004.html)
- 结论依据:原文给出无损分解的判定定律"分解R1,R2是无损分解,当且仅当
F+包含函数依赖R1∩R2→R1或R1∩R2→R2",并明确"若要求规范化程度
达到3NF,可以得到一个既是无损分解又保持函数依赖的分解。但若进一步
提高规范化程度,达到BCNF、4NF,则所得到的分解不能保证保持函数
依赖",因此可以推出两个维度独立、且规范化程度越高越难同时兼顾的
结论。
- 原始内容:分解R1,R2是无损分解,当且仅当F+包含函数依赖R1∩R2→R1
或R1∩R2→R2……若要求规范化程度达到3NF,可以得到一个既是无损分解
又保持函数依赖的分解。但若进一步提高规范化程度,达到BCNF、4NF,
则所得到的分解不能保证保持函数依赖。