数据库系统概论的范式转换问题
一、一个关系模式的码的求解方法
求候选码的简单方法方法:
(1)如果有属性不在函数依赖集中出现,那么它必须包含在候选码中;
(2)如果有属性不在函数依赖集中任何函数依赖的右边出现,那么它必须包含在候选码中;
(3)如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中。
(4)如果有属性或属性组能唯一标识元组,则它就是候选码;
之后对于根据上述方法剔除和加入的key进行组合判断,即将已经选出来的key和其余剩下的属性进行一一组合,然后判断即可
例题:
(1)R<U,F>,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候选码?
因G只在右边出现,所以G一定不属于候选码;
而B,D只在左边出现,所以B,D一定属于候选码;
BD的闭包还是BD,则对BD进行组合,除了G以外,BD可以跟A,C,E进行组合
先看ABD ABD本身自包ABD,而AB-->C,CD-->E,A-->G,所以ABD的闭包为ABDCEG=U
再看BDC CD-->E,E-->A,A-->G,BDC本身自包,所以BDC的闭包为BDCEAG=U
最后看BDE E-->A,A-->G,AB-->C,BDE本身自包,所以BDE的闭包为BDEAGC=U
因为(ABD)、(BCD)、(BDE)的闭包都是ABCDEG所以本问题的候选码有3个分别是ABC、BCD和BDE
二、转换为2nf的方法
这个一般画图就能解决,只要把非主属性对key的部分依赖的部分隔离为一个新的关系就好了。
三、转换为3nf的方法(这里直接写保持依赖and无损分解的转换方法)
1.求解最小依赖集(对每一个依赖关系逐一去掉,判断去掉这个依赖是否对整个依赖集有影响),直接上题
例1:关系模式R<U,F>,其中U={C,T,H,R,S,G},
F={CS→G,C→T,TH→R,HR→C,HS→R},将其分解成3NF并保持函数依赖。
解:根据算法进行求解
(一)计算F的最小函数依赖集
① 利用分解规则,将所有的函数依赖变成右边都是单个属性的函数依赖。由于F的所有函数依赖的右边都是单个属性,故不用分解。
② 去掉F中多余的函数依赖
A.设CS→G为冗余的函数依赖,则去掉CS→G,得:
F1={C→T,TH→R,HR→C,HS→R}
计算(CS)F1+:
设X(0)=CS
计算X(1):扫描F1中各个函数依赖,找到左部为CS或CS子集的函数依赖,找到一个C→T函数依赖。故有X(1)=X(0)∪T=CST。
计算X(2):扫描F1中的各个函数依赖,找到左部为CST或CST子集的函数依赖,没有找到任何函数依赖。故有X(2)=X(1)。算法终止。
(CS)F1+= CST不包含G,故CS→G不是冗余的函数依赖,不能从F1中去掉。
B.设C→T为冗余的函数依赖,则去掉C→T,得:
F2={CS→G,TH→R,HR→C,HS→R}
计算(C)F2+:
设X(0)=C
计算X(1):扫描F2中的各个函数依赖,没有找到左部为C的函数依赖。故有X(1)=X(0)。算法终止。故C→T不是冗余的函数依赖,不能从F2中去掉。
C.设TH→R为冗余的函数依赖,则去掉TH→R,得:
F3={CS→G,C→T,HR→C,HS→R}
计算(TH)F3+:
设X(0)=TH
计算X(1):扫描F3中的各个函数依赖,没有找到左部为TH或TH子集的函数依赖。故有X(1)=X(0)。算法终止。故TH→R不是冗余的函数依赖,不能从F3中去掉。
D.设HR→C为冗余的函数依赖,则去掉HR→C,得:
F4={CS→G,C→T,TH→R,HS→R}
计算(HR)F4+:
设X(0)=HR
计算X(1):扫描F4中的各个函数依赖,没有找到左部为HR或HR子集的函数依赖。故有X(1)=X(0)。算法终止。故HR→C不是冗余的函数依赖,不能从F4中去掉。
E.设HS→R为冗余的函数依赖,则去掉HS→R,得:
F5={CS→G,C→T,TH→R,HR→C}
计算(HS)F5+:
设X(0)=HS
计算X(1):扫描F5中的各个函数依赖,没有找到左部为HS或HS子集的函数依赖。故有X(1)=X(0)。算法终止。故HS→R不是冗余的函数依赖,不能从F5中去掉。即:F5={CS→G,C→T,TH→R,HR→C,HS→R}
③ 去掉F5中各函数依赖左边多余的属性(只检查左部不是单个属性的函数依赖),没有发现左边有多余属性的函数依赖。
故最小函数依赖集为:F={CS→G,C→T,TH→R,HR→C,HS→R}
2.对于最小依赖集里的依赖,若存在两侧均未出现的属性,则将这些属性划分为一个集合
3.如果要求连接成无损,则直接再添加一个候选码
三、转BCNF
将关系模式R<U,F>分解为一个BCNF的基本步骤是