依赖:
例如 姓名->年龄(如果没有重名),即知道姓名即可知道年龄
术语:
对于X->Y,称X为决定因素。若Y为X的子集,则称为平凡函数依赖,否则非平凡
若X->Y,Y->X则可记为X<–>Y
如果对于X的任意真子集Z,都有Y不依赖于Z,则称Y对X为完全函数依赖(F)反之为部分函数依赖(P)
闭包:
公理系统:
1.自反率:Y若为X的子集,那么X->Y
2.增广率:X->Y, 那么 XZ->YZ
3.传递率:X->Y ,Y->Z, 那么X->Z
常见的使用方法:X->Y由增广率,两边同乘X,有XX=X->XY,由此得到X->XY
求对应元素的闭包(以AB为例):
1.首先先将其闭包初始值设置为AB
2.利用公理系统求出A,B,AB(即其所有组合)的函数依赖,将依赖他们的元素加入闭包
3.重复2过程,直到没有新的元素加入闭包
作用:求码,此过程实质上展现了对应元素对于所有元素的表现能力,若该元素的闭包为整体元素,说明其能作为一个码。若该码的任意真子集都不能成为码,则其为候选码
分解
标准:
1.具有无损连接性
2.保持函数依赖
由上形成了三种标准:满足1,满足2,12均满足
无损连接性的判断算法:
对于R(U,F)以及其分解R1,R2…
1.建表,每一行的标题为Ri的对应元素,每一列的标题为U中元素
2.初始化,将行标题中包含的元素在对应列中标识为aj,其他空位标识为bij
3.扫描,根据F中每一个依赖,先找到依赖左边的元素对应列,找出其中符号相同的行,在每一个对应行将依赖右边的元素对应的列进行标识,标识方法为若该行出现aj,则全标识为aj,否则标识为bmj,m为其中i的最小值
4.当出现某一行全部都为aj,说明为无损连接
5.如果扫描前后表格无变化,则终止
实质:利用依赖进行推导,看看是否能推导出所有元素,即能否通过自然连接对原关系进行还原
图表展示过程
保持函数依赖的判断算法:
对于R(U,F)以及其分解R1,R2…
对于每一个关系Fi,设为X->Y
1.如果Fi中包含的元素(XY),存在一个分解Ri,使得XY属于Ri,那么关系Fi保持
2.如果不存在这样的分解,则使用XYGP算法求出W,看Y是否属于W,是则保持
如果所有F均保持则为保持函数依赖
XYGP算法:
对于X->Y
首先初始化W=X
然后W=W∪((W∩Ri)+∩Ri) ,+号表示闭包
依次循环,直到对于每一个Ri都不再发生变化
范式
高级范式为低级范式的子集,BCNF介于3,4范式之间
1NF
所有关系模型一定是1NF
2NF
满足非主属性完全依赖于任何一个候选码的关系数据库
不满足2NF会产生以下问题:
1.插入异常
2.删除异常
3.修改复杂
3NF
2NF + 非主属性对码无传递函数依赖(不存在足够的非主属性的话也满足)
BCNF
每一个决定属性集都包含候选码,则R∈BCNF
最小函数依赖
步骤:
1.用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性,例如X->YZ,变成X->Y,X->Z;
2.去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
3.去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A 属于 (X)+,则Y是多余属性,可以去掉。
模式分解
对于R(U,F)
分解成3NF,只保证函数依赖
1.求出最小函数依赖F1
2.将F1中每一个函数依赖组成新的集合
3.将未出现在F中的U中元素单独组成一个集合
4.将所有集合整合在一起,若某个集合为另一个集合的子集,那么可以将其消去
分解成3NF,保证函数依赖和无损连接
在上述方法的最后加入一个候选码的集合并进行子集合并
分解成BCNF的无损连接
1.先按照上页步骤分解为3NF
2. 若某个表Ui不属于BCNF,原因是存在关系 X->A,则, XA分解为一个表,Ui-A 剩余属性一个表。
如: U={A,B,C,D,E },F = {AB->C,B->D,D->E,C->B }, 分解为3NF 为 R1(A,B,C) R2(B,D) R3(D,E)
R1 不属于BCNF, 分解为 (C,B),(A,C)