数据库规范化理论---求候选键

数据库规范化理论—求候选键

 

预备知识:求闭包

1、概念型算法

F 的闭包:

在关系模式 R 中为 F 所逻辑蕴含的函数依赖的全体叫作 F 的闭包,记为 F + 。

 

 

属性集 X 关于函数依赖集 F 的闭包:

设 F 为属性集 U 上的一组函数依赖, X Í U , XF + ={ A|X → A 能由 F 根据 Armstrong 公理导出 } , XF + 称为属性集 X 关于函数依赖集 F 的闭包.

 

算法  求属性集 X ( X Í U )关于 U 上的函数依赖集 F 的闭包 XF +

 

输入: X , F         输出: XF +

步骤:

( 1 )令 X ( 0 ) =X , i =0

( 2 )求 B ,这里 B = { A |( $ V)( $ W )(V → W Î F ∧ V Í X ( i )∧ A Î W) } ;

( 3 ) X ( i+1 ) =B ∪ X ( i )

( 4 )判断 X ( i+1 ) = X ( i )吗 ?

( 5 )若相等或 X ( i ) =U , 则 X ( i )就是 XF + , 算法终止。

( 6 )若否,则 i =i +l ,返回第( 2 )步。

 

2、通俗算法

 

以下是写的比较科学规范的闭包求解方法,设X和Y均为关系R的属性集的子集,F是R上的函数依赖集,若对R的任一属性集B,一旦X→B,必有B⊆Y,且对R的任一满足以上条件的属性集Y1 ,必有Y⊆Y1,此时称Y为属性集X在函数依赖集F下的闭包,记作X+。 

  计算关系R的属性集X的闭包的步骤如下: 

  第一步:设最终将成为闭包的属性集是Y,把Y初始化为X; 

  第二步:检查F中的每一个函数依赖A→B,如果属性集A中所有属性均在Y中,而B中有的属性不在Y中,则将其加入到Y中; 

  第三步:重复第二步,直到没有属性可以添加到属性集Y中为止。 最后得到的Y就是X+

      例(1):   设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C},计算(AE)+

        解:  (1) 令X={AE},X(0)=AE

              (2)在F中寻找尚未使用过的左边是AE的子集的函数依赖,结果是: A→D, E→C;所以 X(1)=X(0)DC=ACDE, 显然 X(1)≠X(0).

              (3) 在F中寻找尚未使用过的左边是ACDE的子集的函数依赖, 结果是: CD→I;所以 X(2)=X(1)I=ACDEI。虽然X(2)≠X(1),但F中寻找尚未使用过函数依赖的左边已经没有X(2)的子集,所以不必再计算下去,即(AE)+=ACDEI。

   说白话一点:闭包就是由一个属性直接或间接推导出的所有属性的集合。

         例如:f={a->b,b->c,a->d,e->f};由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}

 

 

 

一、《架构师考试》讲义算法

难点:1、画函数依赖图不能画错;

          2、没有入度为0的属性或入度为0不能遍历全图时较难。

          3、如何定义“能正常遍历图中所有节点”?当存在多个属性共同决定某属性时,存在歧义易错。例架构师考试2009题26

需要注意问题:

1、图中第二条:“若能正常遍历图中所有节点”指的是该属性集合加起来能遍历全图。举例:设U={A、B、C、D、E},假设零入度的有C和D,C为起点能遍历B、A、E。D为起点能遍历A、E。C和D加起来能遍历所有,故CD集合为候选码。

结论:是一种快速算法,但由于难点3,不属于一种比较严谨的算法。可作为一种参考,若题目较复杂,不建议采用。

 

二、理论算法

以下两个算法都是基于闭包算法的,思路略有差异,算法基本相同。

算法1:理论

首先对于给定的R(U)和函数依赖集F,可以将它的属性划分为4类:
L类,仅出现在F的函数依赖左部的属性。 
R类,仅出现在F的函数依赖右部的属性。  
N类,在F的函数依赖左部和右部均未出现的属性。 
LR类,在F的函数依赖左部和右部两部均出现的属性。  
根据以下定理和推论来求解候选码。  
定理1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。 
推论1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性,则X必为R的唯一候选码。  
定理2:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。  
定理3:设有关系模式R及其函数依赖集F,如果X是R的N类属性,则X必包含在R的任一候选码中。  
推论2:对于给定的关系模式R及其函数依赖集F,如果X是R的N类和L类组成的属性集,且X+包含了R的有属性,则X是R的唯一候选码。  

例:如设有关系模式R(U),其函数依赖集为F,其中:  
U={A,B,C,D,E}, F={A→C,C→A,B→AC,D→AC} 
求R的候选码。  
解:根据函数依赖可得:  
属性B、D为L类,E为N类,因此属性B、D、E必为候选码的成员,且此三个属性的闭包:B+=ABC,(BD)+=ABCD,(BDE)+=ABCDE,根据推论2可得BDE是R的唯一候选码。所以R的候选码为BDE。 如果把例题中关系模式R(U)中的属性E去掉,那么再求R的候选码的话可以根据推论1得出BD为R的唯一候选码。  
快速求解方法适用于判断有属性是属于L类、N类或其中一种的情况下求解。如果有L类和N类的属性,则求解候选码速度非常快。  
简而言之:L、R、N、LR类。根据定理,L、N类必为侯选码之一,如果L+包含全部R,则L为唯一侯选。R类不在任何侯选码中。L+N类且(L+N)+包含所有R,则L+N为唯一侯选。(适于有L、N类至少一种的情况。) 

 

 

算法2:较通俗

在学习数据库的时候,经常要碰到候选键的求取,但是一开始的时候,根本搞不清楚怎么去求,最近看了一些文章和资料,终于搞明白了。

首先来看候选键的定义:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选键。

若W是候选键,则必须满足两个条件:W的闭包是U;W没有冗余。

设关系模式R中U=ABC.......等N个属性,U中的属性在FD中有四种范围:

(1)左右出现;
(2)只在左部出现;
(3)只在右部出现;
(4)不在左右出现;

算法:按以下步骤求候选键:
1.只在FD右部出现的属性,不属于候选码;
2.只在FD左部出现的属性,一定存在于某候选码当中;
3.外部属性一定存在于任何候选码当中;
4.其他属性逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。

例1:R,U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求候选码。

  因G只在右边出现,所以G一定不属于候选码;而B,D只在左边出现,所以B,D一定属于候选码;BD的闭包还是BD,则对BD进行组合,除了G以外,BD可以跟A,C,E进行组合
  先看ABD
  ABD本身自包ABD,而AB-->C,CD-->E,A-->G,所以ABD的闭包为ABDCEG=U
  再看BDC
  CD-->E,E-->A,A-->G,BDC本身自包,所以BDC的闭包为BDCEAG=U
  最后看BDE
  E-->A,A-->G,AB-->C,BDE本身自包,所以BDE的闭包为BDEAGC=U

  因为(ABD)、(BCD)、(BDE)的闭包都是ABCDEG所以本问题的候选码有3个分别是ABC、BCD和BDE

 

例2:R,U=(A,B,C),F={AB-->C,C-->B},求候选码。

因为A只出现在左边,所以A一定是候选键。A的闭包还是A,则对A进行组合,可以和B,C进行组合。

首先看AB,AB本身自包AB,而AB-->C,所以AB的闭包是ABC=U。

再看AC,AC本身自包AC,而C-->B,所以AC的闭包是ABC=U。

因为AB,AC的闭包都是ABC,也就是U,所以候选键是AB,AC。

 

结论:算法一可作参考,不宜采用。算法二.2推荐采用。考试时由于题目只会出现在选择题,可以结合排出法、倒推(算闭包法)得出答案。

 

 

 

你可能感兴趣的:(数据库)