跳到主要内容

分解方法

如何把关系分解到 BCNF?​

  • 定位: 找到一个违反 BCNF 的非平凡函数依赖 A→BA \rightarrow B;
  • 分裂: 把 A∪BA \cup B 建成一个新的关系表, 原关系表保留 R−BR - B 的属性;
  • 递归: 对新建立的关系表继续做同样的检查与分裂;
  • 停止: 所有关系表都不再含违反 BCNF 的非平凡依赖;
  • 代价: 逐步分裂可能丢失原有依赖, 见 范式概览;

如何按多值依赖分解?​

  • 定位: 找到一个违反第四范式的非平凡多值依赖 A↠BA \twoheadrightarrow B;
  • 分裂一: 把属性组 AA 与 BB 建成一个关系表;
  • 分裂二: 把不属于 AA 与 BB 的属性建成另一个关系表;
  • 递归: 对新建立的关系表继续按同样规则分解;

分解时怎样保证不丢信息?​

  • 原则: 分解后的关系表可以通过连接还原出原关系;
  • 手段: 每次分裂都保留连接属性组 AA, 使两侧能重新连接;
  • 检查: 用多值依赖的定义验证还原结果, 见 多值依赖;

(source: 020-关系数据库设计理论.md §关系数据库模式设计/§分解方法)