关系模式的分解
无损分解:对关系模式分解时,原关系模式的任何一个合法的关系值在分解之后应该能通过自然连接运算恢复起来,这就是无损连接所要解决的问题。
例1:
设有关系模式R(ABC),分解成ρ={AB,AC}。
2.无损分解的测试方法
输入:关系模式R(A1,A2,A3.....,An),他的函数依赖集F以及分解ρ={R1,R2,R3......Rk}.
算法(检验无损分解):
- 构造一个k行n列的表,第i行对应于关系模式Ri,第j列对应于属性Aj,如Aj∈Ri,则在第i行第j列上放符号ai,否则放符号bij.
- 逐个检查F中的每一个函数依赖,并修改表中的元素,其方法如下:取F中的一个函数依赖X->Y,在X的分量中寻找相同的行,然后将这些行中的Y中的分量修改为相同的符号,如果其中有aj,则将bij修改为aj,若其中无aj,则改为bij。
- 这样反复进行,如果发现某一行变成了a1,a2,....an(简称全a行 ),则称ρ具有无损分解,如果F中所有函数依赖都不能再修改表中的内容,且没有这样的行,则分解ρ不具有无损分解。
例子:
设有关系模式R(A,B,C,D),R分解成ρ={AB,BC,CD}.检测ρ是否是无损分解?
初始表格
| A | B | C | D |
AB | a1 | a2 | b13 | b14 |
BC | b21 | a2 | a3 | b24 |
CD | b31 | b32 | a3 | a4 |
修改后的表格
A | B | C | D |
|
AB | a1 | a2 | b13 | b14 |
BC | a1 | a2 | a3 | a4 |
CD | b31 | b32 | a3 | a4 |
此时第2行全为a,即具有无损连接.
当ρ中只包含2个关系模式时,存在一个较简单的测试定理。
定理:如果R的分解为ρ={R1,R2},F为R所满足的函数依赖集合,则分解ρ具有无损连接的充分必要条件为
R1∩R2 -> (R1-R2) 或 R1∩R2 -> (R2-R1)
保持函数依赖分解:
关系模式的范式
1.第一范式: 定义 :设 R 是一个关系模式,如果 R 中的每一个属性 A 的值域中的每个值都是不可分解的,则称 R 是属于第一范式的,记作 R ∈ 1NF。
2.第二范式: 定义: 如果关系 R ∈ 1NF,并且 R 中每一个非主属性完全函数依赖于任一个候选码,则 R ∈ 2NF。
3.第三范式: 定义: 如果关系 R ∈ 2NF,并且 R 中每一个非主属性对任何候选码都不存在传递函数依赖,则 R ∈ 3NF 。
最小依赖集(最小覆盖)
定义:如果函数依赖集满足下列条件,则称F是一个极小函数依赖集。亦称为最小依赖集或最小覆盖。
- F中任一函数依赖的右部仅含有一个属性。
- F中不存在这样的函数依赖X->A,使得F与F-{X->A}等价。
- F中不存在这样的函数X->A,X有真子集Z使得F-{X->A}∪{Z->A}与F等价。
上述三个条件的作用是:(1)保证了每个函数依赖的右部都不会有多个属性,(2)保证了F中没有多余的函数依赖,(3)保证了函数依赖的左部没有重复属性。显然,每个函数依赖集至少存在一个函数依赖集,但不一定唯一。
将关系范式转换成3NF的保持函数依赖的分解
算法:设F是模式R(U)的函数依赖集,X和A是属性集U的子集,分解步骤如下:
- 对R(U,F)中的F进行极小化(最小覆盖)处理,处理后的函数依赖集仍用F表示;
- 找出不在F中出现的属性,把这样的属性构成一个关系模式,并把这些属性从U中去掉。
- 如果F中有一个函数依赖涉及R的全部属性,则R不能再分解。如果F中含有X->A,则应包含模式XA,如果X->A1,X->A2....X->An都属于F,则分解应该包括模式XA1A2...An。
例题:设有关系模式R(U,F),其中属性集U={A,B,C,D,E},
函数依赖集F={A→B,A→C,B→C,AD→E}
解:由于A→B, B→C可以推导出A→C,所以A→C是多余的函数依赖,所以F的一个最小覆盖为{A→B,B→C,AD→E}。按照3NF保持函数依赖和无损连接算法,首先根据左部相同分组得到:AB、BC、ADE,然后将R的关键字AD添加进来,由于AD包含在ADE中,所以去除AD。最终结果为AB、BC、ADE。