【数据库原理】关系数据库理论(四)

分解关系模式概述.

关系数据库理论(一)中给出过一个泛模式的例子:
【数据库原理】关系数据库理论(四)
像这样的一个关系模式,没有将属性间的依赖关系分析清楚,只是笼统地将凡是出现了的属性都纳入麾下,对于这样的关系模式而言,其本身的数据结构蕴藏着许多致命的问题,对于数据的修改、插入以及删除将会导致不便乃至错误的出现。
而这些问题可以通过对于关系模式进行分解来解决,在关系数据库理论(一)中我们也给出了一个分解的样例。简单地说,分解就是运用关系代数运算中的投影操作把一个关系模式拆解成多个,从关系实例的角度看,就是用多个小规模的表代替原来那个复杂的表,使得每一个小规模表的数据结构更加合理,避免实际使用过程中的不便以及错误的出现。

模式分解定义.

【数据库原理】关系数据库理论(四)
泛关系模式R(U)所对应的当前值r被称为泛关系,我们做出了一个分解以后需要考虑:数据是存储在数据库σ中的,那么此时的σ和r是否表示了相同的数据库?如果不是,那这个分解就没有意义了,因为分解导致了某些数据的丢失。
这个问题需要从下面两个角度考虑:

  • σ和r是否等价,即它们是否表示了相同的数据,这个问题用【无损连接】特性表示;
  • 在关系模式R(U)上有一个函数依赖集F,而在ρ的每一个关系模式RiR_i上都有一个函数依赖集FiF_i,那么{F1,F2,...,FkF_1,F_2,...,F_k}与F是否等价呢,这个问题用【保持函数依赖】特性表示.

可见关系模式的分解,不仅是数据集合的分解,也体现了对关系模式上函数依赖集和关系模式当前值(关系实例)的分解。因此衡量一个关系模式的分解ρ是否可取,主要有两个标准:

  1. 是否具有无损连接;
  2. 是否保持函数依赖.

★测试无损连接.

【数据库原理】关系数据库理论(四)
【数据库原理】关系数据库理论(四)
【数据库原理】关系数据库理论(四)
【数据库原理】关系数据库理论(四)

特殊情况快速测试.

当ρ中只有两个关系模式时,即ρ={R1,R2R_1,R_2},存在一个快速测试的方法。虽然用上面的普遍方法也不会太慢。
【数据库原理】关系数据库理论(四)

保持函数依赖分解.

在分解的过程中如果无法保持函数依赖,就可能会导致数据的语义出现混乱。
【数据库原理】关系数据库理论(四)
从定义中可以看出,保持函数依赖的分解是把R分解为R1,R2,...,RkR_1,R_2,...,R_k后,函数依赖集F应该被F在这些小型关系模式上的投影所蕴含。因为F中的函数依赖实际上是关系模式R的完整性约束,R分解后也要保持F,否则完整性就遭到破坏。
但我们需要注意,一个无损连接分解不一定是保持函数依赖的,而一个保持函数依赖的分解,也不一定是无损的,二者并不互相决定。