数据库依赖、范式相关复习与个人总结
前情提要:由于本文中一些概念有点用自己话概括的味道,所以部分概念可能不严谨或者有偏差,请谨慎学习。
首先要知道以下概念
①超键:在关系中能唯一标识元组的属性集称为关系模式的超键。
其中一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
候选键(candidate key):不含有多余属性的超键称为候选键。
②平凡FD与非平凡FD:若X->Y,且Y是X的子集(对任一关系模式,平凡函数依赖必然成立),就是平凡函数依赖。若X->Y,但Y不是X的子集,就是非平凡函数依赖。
③候选键的求解理论与算法
对于给定的·关系R(A1,A2,…An)和函数依赖集F。可以将属性分为4类:
L类 仅出现在函数依赖左部的属性
R类 仅出现在函数依赖右部的属性
N类 在函数依赖左右两边均未出现的属性
LR类 在函数依赖左右两边均出现的属性
一些重要的定理与推论
若x是L类属性,则x必为R的任一候选键的成员。
若x是L类属性,且x+包含了R的全部属性,则x必为R的唯一候选键。
若x是R类属性,则x不在任何候选键中
若x是N类属性,则x必包含在R的任一候选键中
若x是L类和N类组成的属性集,且x+包含了R的全部属性;则x是R的唯一候选键。
是否违反BCNF
我认为其中核心之一通俗着来说就是X→Y时,X一定含有键(候选键中的任意一个)
是否违反3NF
通俗来讲就是左边不是超键且右边不是键的一部分则违反。
一些相关的求解
求闭包
求闭包的算法其实比较简单,我就直接上例题讲解了,毕竟理论还是比较晦涩难懂的
假设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A->D,AB->E,BI->E,CD->I,E->C},计算AE的闭包
设置X={AE},X(0)=AE,在F找左边是AE子集的函数依赖,我们找到A->D,E->C,加入到X(0)中得到X1=ACDE,然后由于X1!=X0,继续,在F找未找过的左边是X1子集的函数依赖,有CD->I,X(2)=ACDEI,虽然X(2)!=X(1),但是此时X(2)的子集在F中找不到为找过的,所以结束,AE的闭包为ACDEI。
函数依赖集的投影
我们直接上例题
这里简单的做一下a)
先把AB->DE通过分解性转化为为AB->D,AB->E,
通过传递性
C->E,E->A=>C->A
D->C,C->E,E->A=>D->A
AB->E,E->A=>AB->A,为平凡依赖,可以忽略
AB->D,D->C=>AB->C,
最后必须包含ABC,所以在S中成立的FD集合为{AB->C,C->A},
然后是求最小基本集
首先第一步保证右边单一
我们的{AB->C,C->A}已经满足
第二步则是去掉F左边的冗余属性。
具体方法是列如XY->Z,去掉Y,若X的闭包包含Z,则可以去掉,反之不能。
对于AB->C,我们去掉A,B+不包含C,所以不能去掉,去掉B同理
第三步去掉F中所有冗余依赖关系
具体方法是例如{X->Y,Z->K},去掉X->Y,若X的闭包包含Y,可以去掉,反之不能。
去掉AB->C,AB的闭包不包含C,所以不能去掉;去掉C->A,C的闭包不包含A,所以不能去掉。
那么最后最小基本集依然是{AB->C,C->A}。
关于BCNF与3NF的分解,其实就是上面的一些方法的总结应用,像什么判断是否符合范式,求键,超键是必不可少的,分解的话求闭包,求最小依赖集之类的算法都需要用到。如果有机会下次再说。