当关系模型中的关系不是合适的范式时,则需要对关系进行分解。在数据库中,将表分解为多个表,称为分解。下面列出了关系分解的属性:
- 属性保存:
使用函数依赖,算法将通用关系模式 R 分解为一组关系模式 D = { R1, R2, ….. Rn } 关系数据库模式,其中“D”称为 R 的分解。R中的属性在分解中至少会出现在一个关系模式Ri中,即没有属性丢失。这称为分解的属性保留条件。
- 依赖保护:
如果 F 中指定的每个函数依赖 X->Y 直接出现在分解 D 中的关系模式 Ri 之一中,或者可以从出现在某些 Ri 中的依赖关系推断出来。这就是依赖保存。如果分解不是依赖保留,则分解中会丢失一些依赖。要检查此条件,请在分解中对 2 个或更多关系进行 JOIN。
例如:
R = (A, B, C) F = {A ->B, B->C} Key = {A} R is not in BCNF. Decomposition R1 = (A, B), R2 = (B, C)
R1 和 R2 在 BCNF 中,Lossless-join 分解,依赖保留。
F 中指定的每个功能依赖要么直接出现在分解的关系之一中。
关系 R 的所有依赖项都不必出现在某个关系 Ri 中。
对所有关系 Ri 的依赖关系的并集等价于对 R 的依赖关系就足够了。 - 非附加连接属性:
分解的另一个属性是 D 应该拥有的非可加连接属性,它确保在对分解产生的关系应用自然连接操作时不会生成虚假元组。 - 无冗余:
分解用于消除一些不良设计的问题,如异常、不一致和冗余。如果关系没有适当的分解,那么可能会导致信息丢失等问题。 - 无损连接:
无损连接属性是归一化支持的分解特性。它能够确保原始关系的任何实例都可以从较小关系中的相应实例中识别出来。例如:
R:关系,F:对 R 的函数依赖集,
X, Y : R 的分解,
如果 R1, R2, …, Rn 的自然连接正好产生关系 R,则关系 R 的分解 {R1, R2, …, Rn} 称为 R 的无损分解。如果我们可以恢复,分解是无损的:
R(A, B, C) -> 分解 -> R1(A, B) R2(A, C) -> 恢复 -> R'(A, B, C)
因此,R’ = R
分解是无损的,如果:
X 交点 Y -> X,即:X 和 Y 共有的所有属性在功能上决定了 X 中的所有属性。
X 交点 Y -> Y,即:X 和 Y 共有的所有属性在功能上决定了 Y 中的所有属性
如果 X 交点 Y 形成 X 或 Y 的超键,则 R 的分解是无损分解。