知识卡片

无损分解与保持函数依赖是分解质量的两个独立维度

结构图卡

内容

把一张表按范式要求拆成多张表后,怎么判断这次拆分是”好”的?答案不是 单一标准,而是两个互相独立、缺一不可的维度。无损分解要求:拆开的多 张表通过自然连接重新拼接后,能够精确还原原表的数据,不多不少—— 判定的充要条件很简洁:两张子表的公共属性必须是其中至少一张子表的 超码(这样连接时才能保证不会产生原表里不存在的”幽灵组合”)。这是 分解能否安全使用的底线:如果连接后凭空多出了原本不存在的行,说明 拆分丢失了信息,这种分解不管范式级别多高都不能用。保持函数依赖要求: 原表上成立的每一条函数依赖,都还能在某一张子表内部单独验证成立,不 需要跨表连接才能验证——如果一条原本成立的约束,分解后必须先把多张 表连接起来才能检查是否违反,那么这条约束在物理层面就变成”无法直接 靠某张表的主码/唯一性索引保证”,容易被绕过。这两个维度互相独立:一次 分解可以是无损的但不保持函数依赖,也可以两者都满足——书中结论是 “规范化到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, 则所得到的分解不能保证保持函数依赖。