有关数据库规范化的问题总结

1.某属性集在依赖集上求闭包

问题描述:已知关系模式R<U,F>,其中
U={A,B,C,D,E},F={AB->C,B->D,C->E,EC->B,AC->B}
求(AB)的闭包。

  1. 已知属性集为{A,B},查找依赖集中左部为A或B或AB的依赖,得{AB->C,B->D},故将{C,D}加入已知属性集中得{A,B,C,D};
  2. 如第一步一样,在依赖级剩余的依赖中,查找依赖集中左部为已知属性集{A,B,C,D}子集的依赖,得{C->E,AC->B},故将{E}加入已知属性集中得{A,B,C,D,E};
  3. 此时已知属性集已经为U,得(AB)的闭包就为{A,B,C,D,E}【注:当已知属性集不再增加时中止循环查找或已知属性集已经达到最大值即U时停止循环查找】

2.函数依赖集的最小依赖集

问题描述:F={A->BD,B->A,B->C,A->C,C->A},求F的最小依赖集。

  1. 将依赖右部不为单属性的拆为单属性即A->BD拆为A->B和A->D得G={A->B,A->D,B->A,B->C,A->C,C->A}
  2. 逐个验证依赖集中的每一个依赖在去掉该属性后是否和原来等价,若等价则去掉此依赖,否则不能去掉。具体方法为:如A->B,G去掉A->B记为G’={A->D,B->A,B->C,A->C,C->A},验证B是否属于属性A关于依赖集G’的闭包,由上一个知识点可求A的闭包为:{A,D,C},B并不在其中故不能删掉该依赖。验证所有依赖后得最小依赖集为{A->B,A->D,B->C,C->A}【注:若上一次验证中可以去掉依赖,则应在去掉后的依赖集上继续验证】

3.候选码

  1. 按照只出现左部(L)、只出现在右部(R)、即出现在左部又出现在右部(LR)、未出现在依赖集中(N),对所有属性经行分组;
  2. N和L中的属性必定包含于候选码之中,对(N,R)求其闭包,若其闭包=属性集,则中止算法,N和L中的属性即为唯一候选码;
  3. 如果其闭包不等于属性集,则对(N,R)添加(LR)中的任意一个属性后进行求闭包,直到求出其闭包等于属性集,则此时的添加后的集合即为候选码,如此依次添加尝试求出所有候选码。

4.模式分解

1)分解的保持函数依赖性的判别

对于依赖集F和分解后的依赖集G来说,判别方法为:
对F中的每一个依赖(X->Y)判断属性Y是否属于X关于G的闭包,且对G中的每一个依赖(M->N)判断属性N是否属于M关于F的闭包,若所有依赖均判断属于则该分解保持函数依赖性。

2)分解的无损连接性的判别

对于R<U,F>,不妨设F为一最小依赖集,分解后的依赖集为G:

  1. 显然分解后的属性集的并集应和U相等,否则直接判断为有损连接;
  2. 建立一张表,以U的每一个属性Aj为列属性,以分解后的每一个依赖集的属性集Ui为横坐标,若属性Aj属于Ui则在其表中交叉处填入aj,否则填入bij;
  3. 对F中的每一个依赖XY->Z检查X,Y均相同的行,更改属性Z对应的列,若对应的属性Z列中含有aj则把Z列中对应行全部改为aj,否则全部改为对应Z中bij的i值最小的那个bij
  4. 对F中的每一个依赖均作第三部处理,当表中数据不再变化时中止,检查中止时是否有一行全部为ai,若有则判定为无损连接,否则为有顺连接。

3)转换为3NF且既有无损连接性又保持函数依赖的分解

  1. 对R<U,F>中的函数依赖集F作最小依赖集处理,处理后的依赖集仍记为F;
  2. 找出不在F中出现的属性(记为U0),分为一个关系模式R0<U0,F0>,把U0从U中去掉,仍记为U;
  3. 把所有依赖按照左部相同进行分组,若一组函数依赖中所涉及的函数依赖Ui为Uj的子集,则去掉Ui
    ,得到一组分组{U1,U2,…,Uk}and{U0};
  4. 若任何一个候选码均不包含于分组{U1,U2,…,Uk}中的任何一个,则添加一个候选码到最终分组即最终分解为{U0,U1,U2,…Uk,候选码}

4)转换为BCNF且既有无损连接性又保持函数依赖的分解

  1. 求R <U,F>的最小依赖集,记为F’
  2. 求R的候选码
  3. 把F’依赖左部不包含候选码中任一属性的第一个依赖分离出来成为一组,并对剩余的候选码中出现在已分离出去的组中右部的属性进行替换,如此继续分离直到每一个分组均满足BCNF要求。

【例如】关系模式R<U,F>,U={A,B,C,D,E},F={A->C,C->D,B->C,DE->C,CE->A}
1.求候选码:
L:B,E
LR:A,C,D
R=N=NULL
又(B,E)的闭包等于U,故候选码为BE
2.求其3NF的无损连接分解
F的最小依赖集为其本身,所有属性均在F中出现
按左部相同分组为{AC,A->C},{CD,C->D},{BC,B->C},{DEC,DE->C},{CEA,CE->A}
合并包含关系的分组为{ACE,A->C,CE->A},{CDE,C->D,DE->C},{BC,B->C}
其中不包含候选码顾添加候选码分组,最终分组为{ACE,CDE,BC,BE}
3.求其BCNF的无损连接分解
F的最小依赖集为其本身,候选码为BE
没有左部为候选码的依赖,左部不含候选码的属性中的第一个依赖分离出来为{AC,A->C},剩余的为
{ABCDE,C->D,B->C,DE->C,CE->A},代换已出现在右部的元素后为{ABDE,B->D,DE->D,BE->A},去掉其中的蕴含关系{DE->D}后为{ABDE,B->D,BE->A},观察发现其存在部分函数依赖{B->D},故继续分解为{BD,B->D}和{BEA,BE->A},故最终分解结果为{AC,BD,BEA}
4.验证3中的分解结果是否为无损链接
建表如下:

ABCDE
ACa1b12a3b14b15
BDb21a2b23a4b25
BEAa1a2b33b34a5

检验A->C

ABCDE
ACa1b12a3b14b15
BDb21a2b23a4b25
BEAa1a2a3b34a5

检验C->D

ABCDE
ACa1b12a3b14b15
BDb21a2b23a4b25
BEAa1a2a3b14a5

检验B->C

ABCDE
ACa1b12a3b14b15
BDb21a2a3a4b25
BEAa1a2a3b14a5

检验DE->C,没有相同的不变

ABCDE
ACa1b12a3b14b15
BDb21a2a3a4b25
BEAa1a2a3b14a5

检验CE->A,没有相同的不变

ABCDE
ACa1b12a3b14b15
BDb21a2a3a4b25
BEAa1a2a3b14a5

这称为一次扫描,显然与原始表发生了变化,故进行第二轮扫描
A->C,不变

ABCDE
ACa1b12a3b14b15
BDb21a2a3a4b25
BEAa1a2a3b14a5

C->D

ABCDE
ACa1b12a3a4b15
BDb21a2a3a4b25
BEAa1a2a3a4a5

B->C,不变

ABCDE
ACa1b12a3a4b15
BDb21a2a3a4b25
BEAa1a2a3a4a5

DE->C,CE->A不变

ABCDE
ACa1b12a3a4b15
BDb21a2a3a4b25
BEAa1a2a3a4a5

第二轮扫描结束,发现第三行已经全部为a,故该分解为无损连接分解,验证结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值