模式分解详解,分解为3NF与分解为BCNF

本文出现了很多错误,在我考研期间所写,经验有所不足,建议不要看了。

 

在模式分解之前,首先对于1NF,2NF,3NF,BCNF有一个简明扼要的介绍。

1NF是一个关系模式最基本的要求,即一个不可分割的关系型数据库即可满足,

2NF要求每个关系模式都必须依赖于主键码。

3NF要求每个关系模式之间不能存在传递依赖与部分依赖。

BCNF要求每个关系模式的左部都至少包含候选关键字。

将关系模式R分解为一个3NF的基本步骤是

1).首先将关系模式R的函数最小依赖集求出来。

2).若求得的函数最小依赖集左部都是单属性,则完成对于关系模式R的3NF分解,结束。

3).去掉多余的函数传递依赖

3).找出不在F中的属性,将其构成一个关系模式并去掉,剩余的记为U。(如例1)

4).将左部相同的属性分为一组。对于每一组的并集若组合成为U,则完成3NF的分解。

 

例1.已知关系模式R,有U={A,B,C,D,E},F={A->B}.将关系模式R分解为3NF且保持函数依赖。

关系模式R的最小函数依赖集为Fm={A->B},在U中没有{C,D,E},于是将(CDE)组成一个关系模式并去掉。

剩余p={R<{A,B},{A->B}>},则关系模式R分解为3NF为(AB)。

 

下一个例题是一个完整的求模式分解的例题。

 

将关系模式R分解为一个BCNF的基本步骤是

1).求出候选关键字,检查R中关系模式是否符合BCNF,若都符合输出即可

2).查看每个关系模式左部是否含有候选关键字,若R中有关系模式S不符合BCNF,则必有X->A属于F+,且X不是S的候选关键字。因为XA不包含S的全部属性,把S分为{S1,S2},其中S1=XA,S2=(S-A)X,分别计算其最小函数依赖集,并将{S1,S2}代替S代入第一步中。

例2.关系模式R,有U={A,B,C,D,E,F,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},

(1)将关系模式分解为3NF且保持函数依赖

(2)将关系模式分解为BCNF

将关系模式分解为3NF且保持函数依赖:

假设B->G冗余,则(B)+=BD,没有G故不冗余。

假设CE->B冗余,则(CE)+=CEGDA,没有B故不冗余。

假设C->A冗余,则(C)+=CD,故不冗余。

一次可以得到最小函数依赖集Fm={B->G,CE->B,C->A,B->D,C->D}。

之后将左部相同的组合并成一个组有:(BDG),(CEB),(CAD).

所以将关系模式分解为3NF且保持函数依赖的结果为:(BDG),(CEB),(CAD).

 

将关系模式分解为BCNF:

首先求出关系模式的候选关键字,对于此处不明白的可以百度如何求关系模式的码。

L型: CE

LR型:B

R型: ADG

因为CE是L型,所以必定是码中的一部分。(CE)+=ABCDEG

所以CE是码。

因为Fm={B->G,CE->B,C->A,B->D,C->D}。

开始找左部不包含CE的关系模式,第一个为B->G,

将其分为R1={(BG),{B->G}}与R2={(ABCDE),{CE->B,C->A,B->D,C->D}}。注意G不能出现在R2中,要根据与G相关的关系模式进行替代。

求R1与R2的最小函数依赖集,步骤均是按照上述算法严格进行的。

R1,R2最小函数依赖集是其本身。

然后再进行分解,R1符合BCNF,继续分解R2:

B->D,左部不含码,于是分解为R2={(BD),{B->D}},R3={(ABCE),{CE->B,C->A}}。

R2,R3的最小函数依赖集均是其本身。

于是BCNF分解的最后结果为{(BG),(BD),(ABCE)}。

你可能感兴趣的:(MySQL)