把厚书读薄,把薄书读厚。

——华罗庚


一、基础概念

(一)关系模式规范化的目的、原则与方法

目的:使得关系结构更加合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。

原则:遵从概念单一化“一事一地”的原则,即一个关系模式描述一个实体或实体间的一种联系。规范化的实质就是概念的单一化。万物皆关系。

方法:将关系模式投影分解成两个或两个以上的关系模式。

(二)函数依赖与逻辑蕴涵

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

数据库基础理论一——候选码求定为主要导向相关推荐

  1. 数据库函数依赖与候选码求解

    函数依赖 1.理解函数依赖: (1)完全函数依赖(F):多个属性[即复合属性]决定一个属性.例:AB两个属性决定属性C. (2)部分函数依赖(P):单个属性就可决定一个属性.例:A属性决定B属性 (3 ...

  2. 数据库原理之候选码的判断方法

    1.如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中(继续求它的闭包,如果他的闭包是属性全集,则为候选码,如果不是,则需要结合其他属性求闭包,继而判断是否是候选码) 2.只在函数依赖集右 ...

  3. 数据库-超码、候选码、主码

    超码(superkey)绝对算得上计算机术语中翻译以后看起来更复杂的一个典型. 超码和码其实没有任何关系,它本质上是一组属性的集合.这一组集合可以唯一的标识出一个元组,就是说不同元组的超码中的属性是不 ...

  4. 数据库中的候选码、主码、全码、外码、主属性

    1.候选码:能够唯一标识一条记录的最小属性集.若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性或属性组做候选码. 2.主码:主码指主关键字.主关键 ...

  5. 候选码的求解基本方法集合

    候选码的求解基本方法集合 一.求解候选码基本算法的具体步骤. 第1 步,求关系模式R < U , F > 的最小函数依赖集F 第2 步, 按照上面的定义, 分别计算出UL ,UR , UB ...

  6. 数据库候选关键词怎么求_数据库中候选码求法.(比较全的哦)

    =ABCDE,又有E→A,求E+=ABCDE而CD→E,求(CD)+=ABCDE,可以得出属性A,E,CD为候选码;除去A,E,CD外,根据一般求解法求两个属性组合的闭包,可以得到(BC)+=ABCD ...

  7. 数据库求候选码的算法

    [例1]关系模型R<U,F>,U={A,B,C,D},F={B→D,AB→C},求R候选码. 在求解之前先要明白一些定理.我们把函数依赖集中F中的属性分为四类: L类:所有依赖关系中仅出现 ...

  8. 数据库期末考试预习之候选码,最小函数依赖集,3NF分解算法,判断第几范式

    一.候选码 参考链接:1 1.定义: 候选码(超级码)就是可以被选为主码的属性或属性组.当一个关系有N个属性或属性组可以唯一标识时,则说明该关系有N个候选码,可以选定其中一个作为主码. 候选码定义: ...

  9. 如何求关系模式的候选码

    对于给定的关系模式R(A,A1,A2,-,An)和函数依赖集F,可以把属性分为以下四类 L类:仅出现在F中的函数依赖左边的左部属性 R类:仅出现在F的函数依赖右边右部属性 N类:在F的函数依赖左右边均 ...

最新文章

  1. 《强化学习周刊》第28期:UNCC提出全新脑-机交互学习模式:内在互动强化学习...
  2. ajax的url可以用变量吗6,如何使用变量设置 Ajax Url
  3. 不可变的基础架构,热部署和JVM
  4. linux中dump文件怎么生成,linux下设置core dump文件生成的方法
  5. 用Python爬虫爬取“女神吧”上的照片。
  6. 软件测试文档测试用例,软件测试用例文档模板(带实例)
  7. 运行通达信行情接口软件的电脑需要什么配置?
  8. jieba 中文分词
  9. 【设计鉴赏】精选字体设计鉴赏(三)
  10. 微信小程序之组件的四种传值方式
  11. openid php steam,在Android中使用openID进行Steam登录
  12. cobaltstrike (cs 使用)初使用
  13. 什么是云服务举例说明_什么叫云服务举例说明(云服务器实例是什么)
  14. 固态硬盘usb测试软件,固态硬盘检测修复坏道三级OP设置软件HDAT2 5.3 ISO版
  15. 031--python--打印机票页面
  16. intent跳转和转场动画
  17. 最新图文识别技术综述
  18. 显示12306服务器处理中正在排队,12306称能够解决技术问题 不与企业合作
  19. easyExcel 导出无数据
  20. 1013 1014

热门文章

  1. demosaic(去马赛克)-目的-原则-流程
  2. 奥比中光(Astra S)开发(两个相机分别获得点云和RGB图像)
  3. carthage踩坑
  4. 【案例】利用 SolidWorks 对连续式碳纤维 3D 打印技术进行创新设计
  5. “个人知识管理”百科
  6. Python爬虫之如何跟妈妈解释什么是爬虫
  7. 计算机科学与技术能自考吗,自考有计算机科学与技术这个专业吗?
  8. BBB学习(二十一):开始把BBB用起来吧
  9. 另一个角度看快手,耀眼的不止是1.38万亿市值
  10. POJ 3133 Manhattan Wiring 笔记