把厚书读薄,把薄书读厚。
——华罗庚
一、基础概念
(一)关系模式规范化的目的、原则与方法
目的:使得关系结构更加合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。
原则:遵从概念单一化“一事一地”的原则,即一个关系模式描述一个实体或实体间的一种联系。规范化的实质就是概念的单一化。万物皆关系。
方法:将关系模式投影分解成两个或两个以上的关系模式。
(二)函数依赖与逻辑蕴涵
1、函数依赖定义:
设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不存在两个元组在X上的属性值相等,而在Y上的属性值不相等的情况,则称X函数决定Y或Y函数依赖于X,记作X->Y。(注:函数依赖不是指关系模式R的某一个或者某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件—个人较为倾向于从关系表中元组和属性列的角度去理解,即属性列包含函数依赖关系则关系内所有元组都必须保证符合函数依赖关系)
2、函数依赖与属性关系:
属性之间有3种关系,设R(U)是属性集U上的关系模式,X、Y是U的子集:
如果X和Y之间是一对一关系,则存在函数依赖X->Y 和 Y->X;
如果X和Y是一对多关系,则存在函数依赖Y->X;
如果X和Y是多对多关系,则X和Y之间不存在函数依赖。
3、函数依赖的分类:
平凡函数依赖:
设R(U)是属性集U上的关系模式,X、Y是U的子集。若X->Y是一个函数依赖且YX,则称X->Y是一个平凡的函数依赖。(在数据库设计中,我们通常不讨论平凡函数依赖,因为它对解决实际问题没有帮助)
完全函数依赖:
设R(U)是属性集U上的关系模式,X、Y是U的子集。若X->Y是一个函数依赖,并且对于任何X′X,X′->Y都不成立,则称X->Y是一个完全函数依赖,即Y函数依赖于整个X,记作X > Y。
部分函数依赖:
设R(U)是属性集U上的关系模式,X、Y是U的子集。若X->Y是一个函数依赖,但不是完全函数依赖,则称X->Y是一个部分函数依赖,或称Y函数依赖于X的某个真子集,记作X > Y。
传递函数依赖:
设R(U)是属性集U上的关系模式,X、Y、Z是U的子集。如果X->Y(YX,X不函数依赖于Y),Y->Z,则X->Z成立,则称Z传递函数依赖于X,记为X >Z 。(注:橙色内容实际上避免了平凡函数依赖和X、Y一对一的无用证明)
4、逻辑蕴涵:
设F是关系模式R的一个函数依赖集,X、Y是R的属性子集,如果从F中的函数依赖能够推出X->Y,则称F逻辑蕴涵X->Y。
(三)Armstrong公理
Armstrong公理:
设A、B、C、D是给定关系模式R的属性集的任意子集,并把A和B的并集A∪B记作AB,则其推理规则可归结为下面3条:
自反律:如果BA,则A->B,这是一个平凡的函数依赖。
增广率:如果A->B,则AC ->BC。
传递律:如果A->B且B->C,则A->C。
Armstrong公理推论延拓:
自合规则:A->A
分解规则:如果A->BC,则A->B且A->C
合并规则:如果A->B且A->C,则A->BC
复合规则:如果A->B且C->D,则AC->BD
伪传递规则:若X->Y且WY->Z,则XW->Z
Armstrong公理系统是有效的、完备的。有效性是指:由F出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中;完备性是指:F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来。(从某个角度来说是充分必要条件的验证)
(四)闭包
1、定义及定理
闭包定义(结果为函数依赖集):被F(函数依赖集)逻辑蕴涵的函数依赖的全体构成的集合称为F的闭包,记作F+。从中易知(类比求子集)判定一个函数依赖是否属于由F根据Armstrong公理推导出来的函数依赖的集合是一个NP完全问题,当F是n个函数依赖时,F+的逻辑蕴涵的函数依赖个数成指数倍增长。
R(U)中某个属性集关于F的闭包计算定义(结果为属性集):
一叙述:
设F是属性集U上的一组函数依赖,XU,则属性集X关于F的闭包XF+(或简写为X+)定义为X={属性集 | 某属性集∈U且X->某属性集,可由F经Armstrong公理导出},即X={属性集 | X->属性集 ∈F+}。
二叙述:(个人推荐)
设有关系模式R(U,F),U={A1,A2....An}是R的属性集,F是R的属性集U上的函数依赖集,X是U的子集,则称所有用Armstrong公理从F推导出的函数依赖X->Ai的属性Ai组成的集合称为X关于F的闭包,记作X,通常简记为X+。即:
X+={Ai | 用公理从F推出的X->Ai} 显然有XX+。
求解引理:设关系模式R(U),F为其函数依赖集,XU且YU,则从F推出X->Y的充要条件是YX+。(此定理有效地将判定X->Y是否能由F依据Armstrong公理导出的问题转化成了求出X+,判定Y是否为X+的子集的问题)
2、引入NP完全问题概念
基于数据结构算法知识,一个算法的渐进时间复杂度我们通常用大O法来表示,其中常见的算法渐进时间复杂度有O(n)、O(n²)等,显然该算法是有效解决方案,对于这样的复杂度,我们称之为多项式时间复杂度。然而对于O(n*log2(n))、O(log2(n))而言,在非多项式表达形式比较其复杂度时,可以将它与一个多项式相除,并运用洛必达法则求在n趋向于无穷大时的值,若求解为常数,也意味着是一个有效的解决方案。
如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则这种可以在多项式时间内解决的判定性问题属于P类问题。通俗来讲所有复杂度为多项式时间的问题为易解的问题类否则为难解的问题。然而有些问题很难找到多项式时间的算法(或许根本不存在),但是如果给了该问题的一个答案,可以在多项式时间内判断这个答案是否正确,这种可以在多项式时间内验证一个解是否正确的问题称为NP问题(Non-deterministic Polynomial),亦称为易验证问题类。
NPC问题(NP完全问题)是指NP中的某些问题的复杂性与整个类的复杂性相关联。这些问题中任何一个如果存在多项式时间的算法,那么所有的NP问题都是多项式时间可解的。通俗来讲,即NP=P?。
(五)函数依赖集的等价和覆盖
对于一个关系模式R(U)上的两个函数依赖集F和G,如果F+=G+,则称F和G是等价的,记作FG。如果函数依赖集FG,则称G是F的一个覆盖,反之亦然。两个等价的依赖集在表示能力上是完全相同的。(显然我们上篇说过求函数依赖的闭包实际上是一个np完全问题,因此需要一个过渡解决办法)
解决定理:两个函数依赖集F和G等价的充分必要条件是FG+,GF+。
该定理表明,要检查两个函数依赖集是等价的,只要验证F中的每一个函数依赖X->Y都在G+中,同时验证G中的每一个函数依赖集都在F+中。验证F中的函数依赖X->Y在G+的方法是计算XG+,验证YXG+。
(六)最小函数依赖集
如果函数依赖集F满足以下条件,则称F为最小函数依赖集或最小覆盖。
1、F中的任何一个函数依赖的右部仅含有单个属性,即右部单一化;
2、F中不存在函数依赖X->A,X有真子集Z,使得F- {X->A}∪{Z->A}与F等价,即左部无多余的属性;
3、F中不存在函数依赖X->A,使得F与F- {X->A}等价,即无多余的函数依赖。
二、R(U)中某个属性集关于F的闭包求法
举个栗子:
已知关系模式R<U,F>,其中U={A,B,C,D,E},F={AB->C,B->D,C->E,EC->B,AC->B},求(AB)F+。
三、函数依赖集等价验证实例
举个栗子:设有F和G两个函数依赖集,F={A->B,B->C},G={A->BC,B->C},判断他们是否等价。
四、最小函数依赖集算法
!!!最小函数依赖集的求法
1、应用分解规则,使F中每一个依赖的右部属性单一化。
2、去掉各函数依赖左部多余的属性。具体做法是一个一个地检查F中左边是非单属性的函数依赖,例如XY->A,则以X->A代替XY->A,判断他们是否等价,只需在F中求XF+,若XF+包含A,则Y是多余的属性,否则Y不是多余的属性,依次判断其他属性即可消除各函数依赖左边的多余属性。
3、去掉多余的函数依赖。具体做法是从第一个函数依赖开始,从F中去掉它(假设该函数依赖为X->Y),然后在剩下的函数依赖中求XF+,看XF+是否包含Y,若是,则去掉X->Y;若否,则不能去掉X->Y,这样依次做下去。
4、最后得到剩下的函数依赖集即为Fmin,它与原来的F等价。
举个栗子:
设有函数依赖集F={AB->C,C->A,BC->D,ACD->B,D->EG,BE->C,CG->BD,CE->AG},求其等价的最小函数依赖集Fmin。
(注:由于候选码可能在同一关系模式中有多个,因此求得的最小函数依赖集也可能不同,相信自己)
五、候选码确定方法
设关系模式为R(U,F),F是最小函数依赖集,确定其候选码的准则如下。
准则1:如果属性A只在F中各个函数依赖的左部出现,则A必是候选码中的属性(L类)
准则2:如果属性A不在F的各个函数依赖中出现,则A必定不是候选码中的属性(N类,我愿称之为孤立属性)
准则3:如果属性A只在F中各个函数依赖的右部出现,则A必定不是候选码中的属性(R类)
!!!确定候选码的步骤如下:(注:易知一个关系中可能有多个候选码)
0、首先将函数依赖集转换为最小函数依赖集;
1、先根据准则2,把不在F中各个函数依赖中出现的属性去掉(去除孤立属性),因为这些属性一般对关系模型没什么意义;
2、根据准则1,将只在F中各个函数依赖的左部出现的属性作为码中的必有属性集,设这样的属性集为M;
3、根据准则3,去掉码中只在F中各个函数依赖右部出现的属性集,即肯定不是候选码的属性集,设为N,求余下的属性集,W=U-M-N;
4、从属性集M开始,令K=M,如果KF+=U,K就是候选码,否则从W中选择属性加入到K中,直至KF+=U为止,K就是候选码。
举个栗子:
假设关系模式R(U,F),U={A,B,C,D,E,G},函数依赖集F={BE->G,BD->G,CDE->AB,CD->A,CE->G,BC->A,B->D,C->D},求其候选码。
参考资料
【1】李春葆 陈良臣 曾平 喻丹丹编著《数据库原理与技术--基于SQL Server 2012 》[M]北京:清华大学出版社,2015
【2】罗蓉 叶霞 李海龙 李俊山编著 《数据库原理及应用(SQL-Server)——内容解析与习题解答》[M]北京:清华大学出版社,2015
【3】王珊 萨师煊编著 《数据库系统概论(第四版)》[M]北京:高等教育出版社,2006.5
【4】Leonardo Liu 《算法基础:NP完全问题》CSDN
【5】Liusiqian0209 《NP完全性理论简介》 CSDN
【6】whatisit 《科普,什么是“NP难”的问题》 CSDN