首先我们从题目入手理解:
解决问题过程:
关系模式R(U, F)
1.求F的最小化基本集
2.求所有候选码
3.根据定义判断关系所属范式
4.根据分解算法将关系分解为要求的范式
解:
- FD{AB->C,C->D,D-> A}已经是最小化基本集(关于如何求解最小化基本集可以看后面的必备知识点)
- 求候选码:
必备知识点:
- 求候选码
对于给定的关系R(A1,A2,…An)和函数依赖集F,可将其属性分为4类:
L类 仅出现在函数依赖左部的属性。
R 类 仅出现在函数依赖右部的属性。
LR类 在函数依赖左右两边均出现的属性。
N 类 在函数依赖左右两边均未出现的属性。
定理:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。
推论:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性;则X必为R的唯一候选码。
当X(X∈R)是L类属性,且X+没有包含R的全部属性,则用L和LR类组合求候选码
- 范式定义:
1NF:强调列的原子性,即列不能再分成其他列
2NF:在1NF的基础上,不存在非主属性对码的部分函数依赖
3NF:在2NF的基础上,不存在非主属性对码的传递函数依赖(对于每个非平凡FD,或者左边是超键,或者右边仅由主属性构成)
BCNF定义的等价语义:属于BCNF的关系模式,每个非平凡依赖的左边必须包括侯选建;
分解成2NF:
分解算法:设关系模式R(U),主键是W,R上存在X→Z,Z是非主属性且XeW,此时W→Z就是一个局部依赖,应将R进行如下分解:(1)将R分解为R1(XZ)(主键是X)和R2(U-Z)(主键是W,外键为X),利用主外键的连接可以得到R;(2)如果R1和R2还不是2NF,则重复上述过程,直到所有关系都满足2NF。
分解成3NF:
把左部组合属性相同的函数依赖中出现的属性放在一个关系里(若分解得到的关系均不包含R的超键,则增加一个关系,其模式为R的任意一个键)
分解成BCNF:
BCNF分解算法 decomposition into BCNF
输入:关系R0和其上的函数依赖F0
输出:由R0分解出的关系集合,其中每个关系均属于BCNF
1 设置R=R0,F=F0
2 若R已经是BCNF,若返回{R}
3 若R存在BCNF违例,假设为X->Y。使用属性闭包算法计算X+,选择R1=X+作为关系模式,使用R2包含属性X和不在X+中的属性。
4 使用FD的投影算法计算R1和R2的FD集,分别记为F1和F2。 5 使用本算法递归地分解R1和R2。返回分解得到的结果集合。
- 定理 每一个函数依赖集F均等价于一个极小函数依赖集Fm
- 最小函数依赖集的算法
- 右部单一化:即所有的右边不是单个属性的依赖变为单个属性。
- 函数依赖最少化:对函数依赖集中每个X->Y假设把这个依赖删除,用剩余的函数依赖求左边属性X的闭包能否包含右边的属性Y,若能包含,则去掉X->Y
- 左部最小化:对于函数依赖AB->Y ,去掉A,得B->Y, 用之前的函数依赖集和去掉A后的函数依赖集计算属性B的闭包,若两者相等,则等价A可以去除
- 同理看B是否能去掉
- 例题:
解:
- 右部单一化:XY→Z,Z→X,Y→X,Y→Z,M→X,M→Y
- 函数依赖最少化:
- 假设去掉XY→Z,(XY)闭包为(X,Y,Z)包含Z,可以去掉这个函数依赖
- Z→X,(Z)闭包为(Z)没有包含X,不能去掉这个函数依赖
- Y→X,Y的闭包为(Y,Z,X)包含X,能去掉这个函数依赖
- Y→Z,Y的闭包为(Y)没有包含Z,不能去掉这个函数依赖
- M→X, M的闭包为(M,Y)不包含X,不能去掉这个函数依赖
- M→Y ,M的闭包为(M,X)没有包含Y,不能去掉这个函数依赖
- 所以剩下:Z→X,Y→Z,M→X,M→Y
- 左部最小化:已经最小化了
- 所以最后的答案是:{Z→X,Y→Z,M→X,M→Y}