关系理论
1)非平凡的函数依赖:X Y,Y X
2)平凡的函数依赖:X Y,Y X
无特殊说明下,均讨论非平凡的函数依赖。即X可以推出Y,但Y不是X的子集。因为一般某个集合总能推出其子集(这种情况就是平凡的函数依赖),没啥用。
3)完全函数依赖:X Y,并且对于X的任意真子集X,都有X Y。则称Y完全函数依赖于X。记作X Y。
4)部分函数依赖:Y不完全函数依赖于X。记作X Y。例如A C,又有AB C,那么C就是部分函数依赖于AB的,这种情况会造成数据冗余。
2、码
(1)候选码:是一个属性组(或者属性),通过该属性组能推出所有的属性,并且该属性组的任意子集都不能再推出所有属性了。即在满足完全函数依赖的前提下,还得是最小的属性组。求所有候选码的方法:例:集合U={A,B,C,D,E,G}。函数依赖集F={AB C,CD E,E A,A G}
Step 1
找出一定属于候选码的属性,可能属于候选码的属性,以及不属于候选码的属性。方法如下:一定属于候选码的属性:只出现在左边,或者左右都没出现可能属于候选码的属性:左右都出现不属于候选码的属性:只出现在右边
例题分析
只出现在左边的是B和D,没有左右都没出现的属性,所以BD一定是属于候选码的属性。左右都出现的有A,C,E,因此这三个是可能属于候选码的属性,即待定的备选。只出现在右边的有G,因此G是不属于候选码的属性,可以不管了。
Step 2
先对确定的属性求闭包,若不能构成候选码,再将确定的属性和待定的属性进行组合,做闭包运算,直到得到的属性组能够推出全部的属性。闭包运算:若要求某属性组的闭包,首先设有集合X,令X={该属性组}。
X =自身
X =X 中的属性所能推出的
当X 不等于X 时,X = X 中的属性能所推出的依次类推…直到X =U或者X = X,就求得了属性组的闭包(X)。ps.闭包运算还可用于判断X Y是否成立:当 Y (X)时,有X Y。
例题分析
根据step1的分析,一定是候选码的为BD。可能是候选码的有A、C、E。于是先对BD求闭包(这里可求得BD推不出全部的属性),因此再分别对BDA,BDC,BDE进行闭包运算,看其是否能得到全部属性。如若不能,再增加如BDAC,BDAE之类的组合,直到求出候选码为止。以BDA为例:设X={BDA}X =BDA X =BDACG
X =X ,有X =BDACGE
因此(BDA)为U,所以(BDA)是候选码全部进行完闭包运算后,可知集合U在F下的候选码为{(BDA), (BDC), (BDE)}
2)超码:能推出所有属性的属性组的集合,根据概念可知,候选码是极小的超码集,是超码的子集
3)主码:当有多个候选码时(如例题那样),挑出一个作为主码,简称码
4)主属性:包含在任何一个候选码中的属性,如例题中的ABBC、DED都是主属性
5)非主属性:不包含在任何一个候选码中的属性,如例题中的G
6)外码:关系模式R中,若有一个属性或属性组X,它不是R的码,但X是另一个关系模式S中的码,称X是R的外码
7)全码:最极端情况下,整个属性组都是码,称为全码
3、范式
1)1NF:所有属性都是不可分割的数据项如果某个属性,例如学校,还可以继续拆分为高中和大学,就不满足1NF了。NF是关系数据库需要满足的最低要求
2)2NF:在满足1NF的前提下,不包含非主属性对码的部分函数依赖(即每一个非主属性都完全函数依赖于码)例如在关系R中,码是学号和班级,非主属性是姓名,因为通过学号就能直接推出姓名了,不需要班级,此处姓名就部分依赖于码了,不满足2NF
3)3NF:在满足2NF的前提下,不包含非主属性对码的传递函数依赖(即码应该直接决定非主属性,不能间接决定)传递函数依赖:若X Y,Y Z,且Z Y,Y X,有X Z,此时称Z对X有传递函数依赖。例如在关系R中,码是客户姓名,非主属性是订单编号和订单负责人,通过客户姓名可以推出他的订单编号,再通过订单编号能推出订单负责人,这种情
况下客户姓名和订单负责人是间接决定的,存在传递函数依赖,不满足3NF
4)BCNF:消除任何属性对候选码的传递依赖,即每一个决定因素都包含码,表现为在函数依赖集当中,左边的都包含候选码(整个属性组!)
5)4NF(应该不考这个):不允许有非平凡且非函数依赖的多值依赖多值依赖(个人理解,仅供参考,我觉得不会细考):X,Y,Z属于集合U,且Z=U-X-Y。当给定一组(x,z)值的时候,可以确定一组Y的值,但这组Y的值仅仅取决于x,此时有X Y。其实这里就是存在了一对多的关系,即一个x和一组z有关,但x并不能唯一确定一个z,通过x和z能找到一组y,但你只通过x也能确定y。平凡的多值依赖:Z是空集非平凡的多值依赖:Z不是空集判断方法与分解方法:R为{A,B,C,D}2NF(没有部分函数依赖):若码是AB,F中若为(A C,AB D},对于C,只需要A就能推出,那么C部分函数依赖于码AB,这种情况就不是2NF。若要分解为2NF,只需将不符合要求的拿出来,即分为R {A,B,D}和R {A,C}3NF(没有部分函数依赖与传递函数依赖):若码是AB,F若为{AB C,C D},这里不存在部分函数依赖。但是对于D,需要AB推出C后才能间接推出D,那么D传递函数依赖于AB,不满足3NF。若要分解为3N F,同样将不符合要求的拿出来,即分为R {A,B,C}和R {C,D}。BCNF(没有部分函数依赖,同时每一个决定因素都包含码):若R是(A,B,C),F是{AC B,AB C,B C},候选码则是AC和AB。这里不存在部分函数依赖,但对于B C来说,决定因素B不包含码,因此它不是BCNF。、最小函数依赖集4求最小函数依赖集的方法step 1: 拆分右侧例如将A BC拆为A B和A Cstep 2: 去除自身求闭包若有有AB C,BC E,AE G,去除AB自身能推出的C,基于剩余的依赖关系求AB的闭包,若AB通过剩余的关系也能求出C,那么删除AB C这个依赖关系step 3: 左侧最小化例如目前保留的关系有ABC D,观察左边的ABC当中,A是否能由BC推出,B是否能由AC推出,C是否能由AB推出。假设C能被AB推出,那么左侧去掉C,更新为AB D。例:设F={C A,CG BD,CE A,ACD B},求最小函数依赖集。
step 1:将CG BD拆分为CG B和CG D。
step 2:C) C,因此保留C A。(CG) CGADB,因此去掉CG B。(CG) CGA, 因此保留CG D。(CE) CEA,因此去掉CE A。(ACD) ACD,因此保留ACD B。
step 3:C A已经是最小。CG D已经是最小。ACD当中,C可以推出A,去掉A,更新为CD B。因此,本题的最小函数依赖集为{C A,CG D,CD B}。
5、模式分解
1)模式分解的准则:无损连接、保持函数依赖
2)无损连接:分解后再次自然连接,与分解前相同
判断无损连接的方法
step 1: 画表格。列表示所有的属性,有多少属性就画多少个属性列。行表示分解后的关系,有几个关系就画几个关系行。
step 2: 根据每一行关系进行判断。找到关系中的每个属性对应第几列,并在相应的位置上标为a ,下标j是表格里的列数。其余关系中不存在的属性则标为b ,ij是表格对应的行数和列数。
step 3: 依次对函数依赖集里的各个依赖关系进行考察。例如有XY Z。在属性列中找到X和Y,观察X和Y的行列上是否有相同的标记(b的下标要相同)。若有,则查看它们对应在属性列Z上的各个标记。其中若有a ,则将属性列上的这些标记全部改为a 。若没有a ,则找到i值最小的b ,将这些标记全部改为b 。
step 4: 反复执行以上操作,直到某一行全部变为a为止,则表明具有无损连接性。否则不具有无损连接性。
例:F={A C,C D,B C,DE C,CE A}。分解为R(AD),R(AB),R(BC),
R(CDE),R(AE)。
step 1:画表格
A B C D E
step 3:更新表格
A B C D E