码迷,mamicode.com
首页 > 数据库 > 详细

关系数据库设计基础(函数依赖、无损连接性、保持函数依赖、范式)(转)

时间:2016-06-10 12:28:11      阅读:707      评论:0      收藏:0      [点我收藏+]

标签:

联系(Relationship)
1:1联系:如果实体集E1中的每个实体最多只能和实体集E2中一个实体有联系,反之亦然,那么实体集E1对E2的联系成为一对一联系,记为1:1;
1:N联系:一对多,记为1:N;
M:N联系:多对多联系,记为M:N。

http://zh.wikipedia.org/wiki/%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0_(%E6%95%B0%E6%8D%AE%E5%BA%93)

函数依赖(Function Dependency)

定义
设关系模式R(U),属性集合U= {A1,A2,…,An},X,Y为属性集合U的子集,如果对于关系模式R(U)的任一可能的关系r,r中的任意两个元组u、v,若有 u[X]=v[X],就有u[Y]=v[Y],则称X函数决定Y,或称Y函数依赖于X。用符号X→Y表示。其中X为决定因素,Y为被决定因素。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值性等,而在Y上的属性值不等。
 (1) 函数依赖是语义范畴的概念,只能根据语义来确定一个函数依赖关系。
 (2) 函数依赖X→Y的定义要求关系模式R的任何可能的关系r中的元组都满足函数依赖条件。
术语
 (1)若X→Y,则X称作决定因素(Determinant)
 (2)若X→Y,Y→X,称作X<->Y。
 (3)若Y不函数依赖于X,称作X -/-> Y。
 (4)X→Y,若Y不包含X,则称X→Y为非平凡的函数依赖。正常讨论的都是非平凡的函数依赖。
 (5)X→Y,若Y包含X,则称X→Y为平凡的函数依赖。
 (6)完全函数依赖(full functional dependency):在R(U)中,设X、Y是关系模式R(U)中不同的属性子集,若存在 X→Y,且不存在 X的任何真子集X‘,使得 X‘→Y,则称Y完全函数依赖 ( full functional dependency ) 于X。记作 X-F->Y。

 (7)部分函数依赖:在关系模式R(U)中,X、Y是关系模式R(U)中不同的属性子集,若X→Y成立,如果X中存在任何真子集X‘,而且有X‘→Y也成立,则称Y对X是部分函数依赖,记作:X-P->Y。

 (8)设R是关系模式,U是其属性集,K包含于U。若K完全函数确定U,则称K是R的候选键(又叫候选关键字,候选码)。包含在任意候选键内的属性称为键属性(又叫主属性),不是键属性的属性称为非键属性(又叫非主属性)。显然,候选键可以唯一标识关系的元组。候选键可能不唯一,通常指定一个候选键作为识别元组的主键

唯一性
(2)K的任何真子集都不满足条件 ————
整个实体集的性质,而不是单个实体的性质。
它包括超码,候选码,主码。

 

一题搞懂什么是候选键

 

学号

姓名 性别 年龄 系别

专业

20020612 李辉 20 计算机 软件开发
20020613 张明 19 计算机 软件开发
20020614 王小玉 18 物理 力学
20020615 李淑华 17 生物 动物学
20020616 赵静 21 化学 食品化学
20020617 赵静 20 生物 植物学

【题目】数据库中有一个学生信息表如上所示,在该表中不能作为候选键的属性集合为( ) (选择一项)

a){学号}              b){学号、姓名}            c){年龄、系别}            d){姓名、性别}            e){姓名、专业}

【解析】透过概念,我们可以了解到,超键包含着候选键,候选键中包含着主键。主键一定是惟一的。为什么呢?因为他的爷爷超键就是惟一的。
我们分析一下上面的题目,a,b,c,d,e,5个答案都可以作为超键,他们组合在一起的集合可以用来惟一的标识一条数据记录(实体)。
请注意我们的要求:候选键。候选键要求是不能包含多余属性的超键,我们看一下答案b。在答案b中,如果我们不使用姓名也可以惟一的
标识一条数据实体,可以说姓名字段在这里是多余的。那么很明显,b选项包含了多余字段属性。那么这题答案应该选择b。

那么其他的4个选项都可以作为候选键,假设很幸运,a){学号}被选择作为用户正在使用的候选键来惟一标识元组了,那么他很幸运的获得了主键的称号

【答案】b

 (9)若关系R的属性子集X是另一关系S的候选键,则称X是R关于S的外部键主键和外部键描述了关系之间的联系。
 (10)传递函数依赖:在关系模式R(U) 中,如果Y→X,X→A,且X技术分享Y(X不决定Y), A技术分享X(A不属于X),那么称Y→A是传递依赖。

函数依赖的推理规则

1. 逻辑蕴含
  给定一个关系模式,只考虑给定的函数依赖是不够的,必须找出在该关系模式上成立的其他函数依赖。
  逻辑蕴含:设F是关系模式R(U)的函数依赖集合,由F出发,可以证明其他某些函数依赖也成立,我们称这些函数依赖被F逻辑蕴含。"F蕴含X→Y"意味着关系实例只要满足F就满足X→Y。
  例如,设F={ A→B,B→C },则函数依赖A→C被F逻辑蕴含,记作:F |= A→C。即函数依赖集 F 逻辑蕴含函数依赖A→C。
2. F的闭包F+
  对于一个关系模式,如何由已知的函数依赖集合F,找出F逻辑蕴涵的所有函数依赖集合呢?这就是我们下面要讨论的问题。
  F的闭包F+:设F为一个函数依赖集,F的闭包是指F逻辑蕴涵的所有函数依赖集合。 F的闭包记作F+
  例如,给定关系模式R(A,B,C,G,H,I),函数依赖集合F={A→B,A→C,CG→H,CG→I,B→H}。可以证明函数依赖A→H被F逻辑蕴涵。
  设有元组s和t,满足s[A]=t[A],根据函数依赖的定义,由已知的A→B,可以推出s[B]=t[B]。又根据函数依赖B→H,可以有 s[H]=t[H]。因此,已经证明对任意的两个元组s和t,只要有s[A]=t[A],就有s[H]=t[H]。所以,函数依赖A→H被F逻辑蕴涵。
  计算F的闭包F+,可以由函数依赖的定义直接计算,如上面的示例。但是,当F很大时,计算的过程会很长。为了从已知的函数依赖推导出其它函数依赖,Armstrong 提出了一套推理规则,称为Armstrong 公理 ,通过反复使用这些规则,可以找出给定F的闭包F+。其推理规则可归结为如下3条:自反律(reflexivity)、增广律(augmentation)和 传递律(transitivity)。

3.Armstrong 公理
  设U为属性总体集合,F为U上的一组函数依赖,对于关系模式R(U,F),X、Y、Z为属性U的子集,有下列推理规则:
   A1:自反律(reflexivity)     若Y X U,则X→Y为F所蕴函。
   A2:增广律(augmentation)  若X→Y为F所蕴函,且Z是U的子集,则XZ→YZ为F所蕴函。式中XZ和YZ是X∪Z 和 Y∪Z的简写。
   A3:传递律(transitivity)  若X→Y、Y→Z为F所蕴函,则X→Z为F所蕴函。
  由自反律所得到的函数依赖都是平凡的函数依赖,自反律的使用并不依赖于F,而只依赖于属性集U。
  Armstrong公理是有效的和完备的。可以利用该公理系统推导F的闭包F+。由于利用Armstrong公理直接计算F+很麻烦。根据A1, A2, A3这三条推理规则还可以得到其他规则,用于简化计算F+的工作。如下面扩展的三条推理规则:
  *合并规则: 由X→Y, X→Z, 有X→YZ
  *伪传递规则: 由X→Y, WY→Z, 有XW→Z
  *分解规则: 由X→YZ, 则有X→Z,X→Y
  Armstrong公理可以有多种表示形式,例如,增广律A2可以用合并规则代替。例如,用自反律A1,传递律A3和合并规则可推导出增广律A2。
  证明:XZ →X (A1:自反律)   X →Y (给定条件)   XZ →Y (A3:传递律)  XZ →Z (A1:自反律)  XZ →YZ (合并规则)
4.属性集的闭包
  原则上讲,对于一个关系模式R(U,F),根据已知的函数依赖F,反复使用前面的规则,可以计算函数依赖集合F的闭包F+。但是,利用推理规则求出其全部的函数依赖F+是非常困难的,而且也没有必要。因此,可以计算闭包的子集,即选择一个属性子集,判断该属性子集能函数决定哪些属性,这就是利用属性集闭包的概念。
 (1)属性集闭包的定义
  设F为属性集U上的函数依赖集,X∈U,即X为U的一个子集。在函数依赖集F下被X函数决定的所有属性为F+下属性集X的闭包,记作X+。即X+={ A| X→A } 。
 (2)计算属性集闭包X+的算法如下:
  输入:X,F
  输出: X+
 迭代算法的步骤:
  ① 选取X+的初始值为X ,即X+={X};
  ② 计算X+, X+={X,Z} ,其中Z要满足如下条件:
Y是X+的真子集,且F中存在一函数依赖Y→Z。实际上就是以X+中的属性子集作为函数依赖的决定因素,在F中搜索函数依赖集,找到函数依赖的被决定属性Z放到X+中。
  ③ 判断:如果X+没有变化?或X+等于U?则X+就是所求的结果,算法终止。否则转②。
 因为U是有穷的,所以上述迭代过程经过有限步骤之后就会终止。


 例如,已知关系模式R(U,F),U={A,B,C,D,E,G},F={AB→C,D→EG,C→A,BE→C,BC→D,AC→B,CE→AG},求(BD)+
   解:
   ① (BD)+ = {BD};
   ② 计算(BD)+ ,在F中扫描函数依赖,其左边为B,D或BD的函数依赖,得到一个D→EG。所以,(BD)+= {BDEG}。
   ③ 计算(BD)+,在F中查找左部为BDEG的所有函数依赖,有两个:D→EG和BE→C。所以(BD)+={(BD)∪EGC}={BCDEG}。
   ④ 计算(BD)+,在F中查找左部为BCDEG子集的函数依赖,除去已经找过的以外,还有三个新的函数依赖:C→A,BC→D,CE→AG。得到(BD)+={(BD)∪ADG}={ABCDEG}。
   ⑤ 判断(BD)+=U,算法结束。得到(BD)+={ABCDEG}。
  说明:上面说明(B,D)是该关系模式的一个候选码。


5. Armstrong公理系统的有效性和完备性
  ①Armstrong公理系统的有效性指的是:由F出发根据Armstrong公理系统推导出来的每一个函数依赖一定是F所逻辑蕴含的函数依赖。
  ②Armstrong公理系统的完备性指的是:对于F所逻辑蕴含的每一函数依赖,必定可以由F出发根据Armstrong公理系统推导出来。

6. 极小函数依赖集(最小函数依赖集)

定义:如果函数依赖集F满足下列条件,则称F为最小函数依赖集或最小覆盖。   
   ① F中的任何一个函数依赖的右部仅含有一个属性;   
   ② F中不存在这样一个函数依赖X→A,使得F与F-{X→A}等价;
   ③ F中不存在这样一个函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。   
求最小函数依赖集分三步:
   1.将F中的所有依赖右边化为单一元素
   此题fd={abd->e,ab->g,b->f,c->j,cj->i,g->h};已经满足
 
   2.左边的冗余属性.
   作法是属性中去掉其中的一个,看看是否依然可以推导
   此题:abd->e,去掉a,则(bd)+不含e,故不能去掉,同理b,d都不是冗余属性
   ab->g,也没有
   cj->i,因为c+={c,j,i}其中包含i所以j是冗余的.cj->i将成为c->i
   F={abd->e,ab->g,b->f,c->j,c->i,g->h};

   3.去掉F中所有冗余依赖关系.
   做法为从F中去掉某关系,如去掉(X->Y),然后在F中求X+,如果Y在X+中,则表明x->是多余的.需要去掉.

  此题如果F去掉abd->e,F将等于{ab->g,b->f,c->j,c->i,g->h},而(abd)+={a,d,b,f,g,h},其中不包含e.所有不是多余的.

   同理(ab)+={a,b,f}也不包含g,故不是多余的.
   b+={b}不多余,c+={c,i}不多余
   c->i,g->h多不能去掉.
   所以所求最小函数依赖集为 F={abd->e,ab->g,b->f,c->j,c->i,g->h};

多值依赖

1、定义

设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

若X→→Y,而Z=技术分享,则称X→→Y为平凡的多值依赖。否则称X→→Y为非平凡的多值依赖

多值依赖也可以形式化地定义如下: 在关系模式R(U)的任一关系r中,如果对于任意两个元组t,s,有t[X]=s[X],就必存在元组w,v∈r(w和v可以与s和t相同),使得 w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=t[Z],即交换s,t元组的Y值所得的两个新元组必在r中,则称Y多值依赖于X,记为X→→Y。其中,X和Y是U的子集,Z=U-X-Y。

多值依赖属4nf的定义范围,比函数依赖要复杂得多,很多书上都没有讲清楚。

2、说得简单点就是

在关系模式中,函数依赖不能表示属性值之间的一对多联系,这些属性之间有些虽然没有直接关系,但存在间接的关系,把没有直接联系、但有间接的联系称为多值依赖的数据依赖。例如,教师和学生之间没有直接联系,但教师和学生可通过系名,或任课把教师和学生联系起来。

3、举例如下

【例1】有这样一个关系 <仓库管理员,仓库号,库存产品号> ,假设一个一个产品只能放到一个仓库中,但是一个仓库可以由若干管理员,那么对应于一个 <仓库管理员,库存产品〉有一个仓库号,而实际上,这个仓库号只与库存产品号有关,与管理员无关,就说这是多值依赖。

【例2】(C,B) 上的一个值(物理,光学原理)对应一组T值(李平,王强,刘明),这组值仅仅决定于课程C上的值,也就是说对于(C,B)上的另一个值(物理,普通物理 学),它对应的一组T值仍是(李平,王强,刘明),尽管这时参考书B的值已经改变了。因此T多值依赖于C,即C→→T。

4、多值依赖具有下列性质

●多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y。

●多值依赖具有传递性。即若X→→Y,Y→→Z,则X→→Z-Y。

●函数依赖可以看作是多值依赖的特殊情况。

●若X→→Y,X→→Z,则X→→YZ。

●若X→→Y,X→→Z,则X→→Y∩Z。

●若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y。

●多值依赖的有效性与属性集的范围有关。

●若多值依赖X→→Y在R(U)上成立,对于Y‘技术分享Y,并不一定有X→→Y’成立。但是如果函数依赖X→Y在R上成立,则对于任何Y‘技术分享Y均有X→Y’成立。

范式

无重复的列

• 如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。【消去非主属性对键的部分函数依赖
缺点:删除异常,插入异常,修改复杂
消去非主属性对键的部分和传递函数依赖】
部分和传递函数依赖】

X),X都含有码,则称R∈4NF。【消除非平凡且非函数依赖的多值依赖

? ? http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A7%84%E8%8C%83%E5%8C%96以下的论述都基于这样一个前提:
R是具有函数依赖集F的关系模式,(R1 ,R2)是R的一个分解。

首先我们给出一个看似无关却非常重要的概念:属性集的闭包。
令α为一属性集。我们称在函数依赖集F下由α函数确定的所有属性的集合为F下α的闭包,记为α+ 。
下面给出一个计算α+的算法,该算法的输入是函数依赖集F和属性集α,输出存储在变量result中。
算法一:
result:=α;
while(result发生变化)do
    for each 函数依赖β→γ in F do
    begin
        if β∈result then result:=result∪γ;
    end

属性集闭包的计算有以下两个常用用途:
·判断α是否为超码,通过计算α+(α在F下的闭包),看α+ 是否包含了R中的所有属性。若是,则α为R的超码。
·通过检验是否β∈α+,来验证函数依赖是否成立。也就是说,用属性闭包计算α+,看它是否包含β。

(请原谅我用∈符号来表示两个集合之间的包含关系,那个表示包含的符号我找不到,大家知道是什么意思就行了。)

看一个例子吧,2005年11月系分上午37题:

● 给定关系R(A1,A2,A3,A4)上的函数依赖集F={A1→A2,A3→A2,A2→A3,A2→A4},R的候选关键字为________。
(37)A. A1  B. A1A3  C. A1A3A4  D. A1A2A3

首先我们按照上面的算法计算A1+ 。
result=A1,
由于A1→A2,A1∈result,所以result=result∪A2=A1A2
由于A2→A3,A2∈result,所以result=result∪A3=A1A2A3
由于A2→A4,A2∈result,所以result=result∪A3=A1A2A3A4
由于A3→A2,A3∈result,所以result=result∪A2=A1A2A3A4

通过计算我们看到,A1+ =result={A1A2A3A4},所以A1是R的超码,理所当然是R的候选关键字。此题选A 。


好了,有了前面的铺垫,我们进入正题。

无损分解的判断。
如果R1∩R2是R1或R2的超码,则R上的分解(R1,R2)是无损分解。这是一个充分条件,当所有的约束都是函数依赖时它才是必要条件(例如多值依赖就是一种非函数依赖的约束),不过这已经足够了。

保持依赖的判断。
如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(这是一个充分条件)。
如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断。
该方法的表述如下:
算法二:
对F上的每一个α→β使用下面的过程:
result:=α;
while(result发生变化)do
    for each 分解后的Ri
        t=(result∩Ri)+ ∩Ri
        result=result∪t

这里的属性闭包是在函数依赖集F下计算出来的。如果result中包含了β的所有属性,则函数依赖α→β。分解是保持依赖的当且仅当上述过程中F的所有依赖都被保持。


下面给出一个例题,2006年5月系分上午43题:

●设关系模式R<U, F>,其中U={A, B, C, D, E},F={A→BC,C→D,BC→E,E→A},则分解ρ={R1(ABCE),R2(CD)}满足 (43) 。
(43) A.具有无损连接性、保持函数依赖
              B.不具有无损连接性、保持函数依赖
              C.具有无损连接性、不保持函数依赖
              D.不具有无损连接性、不保持函数依赖

先做无损链接的判断。R1∩R2={C},计算C+。
Result=C
由于C→D,C∈result,所以result=result∪D=CD
可见C是R2的超码,该分解是一个无损分解。

再做保持依赖的判断。
A→BC,BC→E, E→A都在R1上成立(也就是说每一个函数依赖左右两边的属性都在R1中),C→D在R2上成立,因此给分解是保持依赖的。

选A。


再看一个复杂点的例题。2007年5月数工40-41题。

●给定关系模式R<U, F>,U={A, B, C, D, E},F={B→A,D→A,A→E,AC→B},其候选关键字为
(40) ,则分解ρ={R1(ABCE),R2(CD)}满足 (41) 。
(40) A.ABD
              B.ABE
              C.ACD
              D.CD
(41) A.具有无损连接性、保持函数依赖
              B.不具有无损连接性、保持函数依赖
              C.具有无损连接性、不保持函数依赖
              D.不具有无损连接性、不保持函数依赖

看见了吧,和前面一题多么的相像!
对于第一问,分别计算ABCD四个选项的闭包,
(ABD)+ = { ABDE }
(ABE)+ = { ABE }
(ACD)+ = { ABCDE }
(CD)+ = { ABCDE }
选D。

再看第二问。
先做无损链接的判断。R1∩R2={C},计算C+。
result=C
因此C既不是R1也不是R2的超码,该分解不具有无损分解性。

再做保持依赖的判断。
B→A,A→E,AC→B在R1上成立,D→A在R1和R2上都不成立,因此需做进一步判断。
由于B→A,A→E,AC→B都是被保持的(因为它们的元素都在R1中),因此我们要判断的是D→A是不是也被保持。

对于D→A应用算法二:
result=D
对R1,result∩R1=ф(空集,找不到空集的符号,就用这个表示吧),t=ф,result=D
再对R2,result∩R2=D,D+ =ADE ,t=D+ ∩R2=D,result=D
一个循环后result未发生变化,因此最后result=D,并未包含A,所以D→A未被保持,该分解不是保持依赖的。

选D。

关系数据库设计基础(函数依赖、无损连接性、保持函数依赖、范式)(转)

标签:

原文地址:http://www.cnblogs.com/3013218061shang/p/5573459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!