# 模式分解

把一个关系模式,分解成若干个关系模式(把一张表分解成若干张表)

  • 分解后做自然连接,在内容上是否与原来的表等价 \to 分解的无损连接性
  • 分解后做自然连接,在数据依赖(约束)上是否与原来的表等价 \to 分解的保持依赖性

# 什么情况下需要分解

当关系模式不符合关系范式时,需要分解(一般是 3NF3NF
分解规则:将每一个函数依赖单独组成一个关系

# 无损连接性

  • 找出分解的两个表(R1,R2R_1,R_2)的交集
  • 判断这个交集是否为 R1R_1 的超码或者是 R2R_2 的超码,若满足,则有无损连接性

若满足无损链接性,则:

  • 必须有公共字段,并且公共字段能唯一标识数据

# 保持依赖性

判断在原来的未分解的表中,若每个函数依赖的左右两边的属性,都在被分解后的同一张表中,则有保持依赖性

  • 如果拆分后的属性,能推导出原来的所有函数,就有保持依赖性

# 模式分解算法

# BCNF 分解

任取不满足 BCNFBCNF 的依赖,假设为 aba \to b,分解为 R(a,b)R(a, b)R(Ub)R(U - b),然后继续对 R(Ub)R(U - b) 进行判断,直到都满足 BCNFBCNF
BCNFBCNF 分解是无损分解,但不一定是保持依赖分解

# 3NF 分解

  • 先找出最小覆盖
  • 对于最小覆盖中的每个依赖 aba \to b,都分解出一个关系模式 R(a,b)R(a, b)
  • 验证无损连接性
    • 若原候选码 KK 不能再任意一个分解出的关系模式中找到,加一个 R(K)R(K)
    • 如果找得到,那分解结束
      3NF3NF 分解不仅是无损分解,而且是保持依赖分解