Skip to content
难度基础(★)
建议时长45分钟

3.6.6 模式分解-01

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

分解不是随便拆表

提高范式通常要把一个关系模式拆成多个关系模式,但拆表本身不是目标。好的分解至少要保证两件事:数据能还原,约束能保留。本节先看“数据能否还原”,也就是无损连接分解。

模式分解的基本形式是:

R(U,F)ρ={R1(U1),R2(U2),,Rk(Uk)}

其中 U 是原关系属性集,F 是函数依赖集。分解后各子关系的属性并起来应覆盖原属性集:

U1U2Uk=U

但仅仅覆盖全部属性还不够,还要能通过自然连接恢复原关系。

无损连接的含义

无损连接不是“不丢列”,而是“不丢失原关系信息、不产生伪元组”。若把原关系分解为 R1R2,再做自然连接:

R=R1R2

就称为无损连接分解。若连接结果比原关系多出不真实的组合,称为产生伪元组;若不能恢复原有对应关系,就是有损分解。

二元分解的判定

对二元分解 ρ={R1,R2},常用判定条件是:

(R1R2)R1(R1R2)R2

也就是说,两个子模式的公共属性如果能函数决定其中任意一个子模式的全部属性,则分解无损。

步骤做法
1求公共属性 R1R2
2根据函数依赖求公共属性闭包
3若闭包包含 R1 全部属性或 R2 全部属性,则无损
4否则不能直接判为无损,通常视为有损风险

例子:学生与系的分解

原关系:

学生(学号,姓名,系号,系名,系位置)

函数依赖:

学号姓名,系号系号系名,系位置

分解为:

R1(学号,姓名,系号)R2(系号,系名,系位置)

公共属性是 系号。因为:

系号系名,系位置

所以 系号 能决定 R2 的全部属性,分解是无损连接的。系号 同时保留在两个关系中,正是为了连接还原。

与范式提升的关系

消除部分依赖或传递依赖时,常把造成异常的依赖单独拆出。例如 课程号 -> 学分 应拆成 课程(课程号, 学分),但原选课关系仍保留 课程号,否则无法表达“某学生选了某课程并取得某成绩”。

分解不是把相关属性完全移走,而是把依赖关系拆清楚,同时保留必要的连接属性。

做题路线

  1. 看到“自然连接后能否恢复原关系”,判断无损连接。
  2. 对二元分解先求公共属性,再看公共属性能否决定某个子模式。
  3. 若公共属性是某个子模式的候选键,通常就是无损的强信号。
  4. 不要把“属性都覆盖了”误认为无损,关键是连接后不能产生伪元组。

例题

单选
分解后的关系自然连接后能恢复原关系,这种分解称为:
单选
二元分解中,常见的无损连接判定条件是:

自查要点

  1. 无损连接分解要保证什么?
  2. 为什么公共属性很重要?
  3. 二元分解如何快速判定无损?