教你如何判断无损连接和函数依赖
- 格式:doc
- 大小:30.50 KB
- 文档页数:3
[总结]关系数据库设计基础(函数依赖、⽆损连接性、保持函数依赖、范式、……)≏≎≟≗≖≍≭∼∽≁≃≂≅≊≈≉≇≳⪞⪆⋧⪊≵≲⪝⪅⋦⪉≴⊂ subset ⋐⊄⊊ ⊈⊃⊇ ⋑⊅⊋ ⊉≺⪯≼⋞≾⪷⋨⪵⪹⊀≻⪰≽⋟≿⪸⋩⪶⪺⊁ in ∋∉∌∝≬⊸函数依赖(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,则称X→Y为⾮平凡的函数依赖。
正常讨论的都是⾮平凡的函数依赖。
(5)X→Y,若Y包含X,即X ⊂ Y,则称X→Y为平凡的函数依赖。
(6)完全函数依赖(full functional dependency):在R(U)中,设X、Y是关系模式R(U)中不同的属性⼦集(即X ⊂ U,Y ⊂ U), 若存在 X→Y,且不存在 X的任何真⼦集X'(即 X' ⊊ X),使得 X'→Y,则称Y完全函数依赖 ( full functional dependency ) 于X。
记作 X-F->Y。
(7)部分函数依赖:在关系模式R(U)中,X、Y是关系模式R(U)中不同的属性⼦集(即X ⊂ U,Y ⊂ U), 若X→Y成⽴,如果X中存在任何真⼦集X'(即 X' ⊊ X),⽽且有X'→Y也成⽴,则称Y对X是部分函数依赖,记作:X-P->Y。
函数依赖闭包函数依赖闭包⼀、函数依赖的逻辑蕴涵定义:设有关系模式R(U)及其函数依赖集F,如果对于R的任⼀个满⾜F的关系r函数依赖X→Y都成⽴,则称F逻辑蕴涵X→Y,或称X→Y可以由F推出。
例:关系模式 R=(A,B,C),函数依赖集F={A→B,B→C}, F逻辑蕴涵A→C。
证:设u,v为r中任意两个元组:若A→C不成⽴,则有u[A]=v[A],⽽u[C]≠v[C]⽽且A→B, B→C,知u[A]=v[A], u[B]=v[B], u[C]=v[C],即若u[A]=v[A]则u[C]=v[C],和假设⽭盾。
故F逻辑蕴涵A→C。
满⾜F依赖集的所有元组都函数依赖X→Y(X→Y不属于F集),则称F逻辑蕴涵X→Y(X→Y由F依赖集中所有依赖关系推断⽽出)⼆、Armstrong公理1、定理:若U为关系模式R的属性全集,F为U上的⼀组函数依赖,设X、Y、Z、W均为R的⼦集,对R(U,F)有:F1(⾃反性):若X≥Y(表X包含Y),则X→Y为F所蕴涵;(F1':X→X)F2(增⼴性): 若X→Y为F所蕴涵,则XZ→YZ为F所蕴涵;(F2':XZ→Y)F3(传递性): 若X→Y,Y→Z为F所蕴涵,则X→Z为F所蕴涵;F4(伪增性):若X→Y,W≥Z(表W包含Z)为F所蕴涵,则XW→YZ为F所蕴涵;F5(伪传性): 若X→Y,YW→Z为F所蕴涵, 则XW→Z为F所蕴涵;F6(合成性): 若X→Y,X→Z为F所蕴涵,则X→YZ为F所蕴涵;F7(分解性): 若X→Y,Z≤Y (表Z包含于Y)为F所蕴涵,则X→Z为F所蕴涵。
函数依赖推理规则F1∽F7都是正确的。
2、Armstrong公理:推理规则F1、F2、F3合称Armstrong公理;F4 ∽ F7可由F1、F2、F3推得,是Armstrong公理的推论部分。
三、函数依赖的闭包定义:若F为关系模式R(U)的函数依赖集,我们把F以及所有被F逻辑蕴涵的函数依赖的集合称为F的闭包,记为F+。
第1章数据库系统概述一、章节学习目标与要求1、理解数据、数据库、数据库系统、数据库管理系统、数据模型定义、数据模型的三个要素等概念;2、掌握E-R方法、数据库三级模式和两级映象结构以及数据库的独立性概念。
二、章节练习1、选择题1)在数据模型中,对数据库系统动态特性的描述是用_____________。
A、数据结构B、数据操纵C、数据完整性约束D、数据对象2)用户所使用的数据视图的描述称为_____________。
A、外模式B、模式C、内模式D、概念模式3)目前主流的数据模型是_____________A.层次模型B.网状模型C.关系模型D.面向对象模型4)数据库管理系统是_____________A.OS B.DBSC.DBMS D.DB5)涉及数据物理结构描述的模式是_____________A.外模式B.概念模式C.内模式D.模式2、填空题1)数据独立性可分为________________和____________________。
2)数据库的三级模式结构是指数据库系统是由___________、___________和___________构成,两级映像是指______________________和______________________。
3)数据模型的三个组成要素是__________________、____________________和________________________。
4)数据更新包括________________、_________________和____________________。
1:答案:逻辑独立性、物理独立性2:答案:外模式、模式、内模式、外模式/模式映象、模式/内模式映象3:答案:数据结构、数据操作、完整性约束4:答案:插入、删除、修改3、简答题1)什么是数据库?数据库是长期存储在计算机内、有组织的、可共享的数据集合。
数据库是按照某种数据模型进行组织的、存放在外存储器上,且可被多个用户同时使用。
1.常见缩写基于架构的软件设计(Architecture-Based Software Design, ABSD)特定领域软件架构(Domain Specific Software Architecture,DSSA)软件架构评估方法:1)架构权衡分析法(Architecture Tradeoff Analysis Method,ATAM)2)软件架构分析方法(Software Architecture Analysis Method, SAAM)快速应用开发(Rapid Application Development,RAD)软件开发环境(Software Development Environment,SDE)架构描述语言(Architecture Description Language, ADL)“4+1”视图模型(逻辑开发(姬发)进屋里的场景)-类实现进程部署的例子设计模式:1)创建型:单元相公造;2)结构型:理赔乔装观元组软件架构风格:流返购机舱用例关系包括:包含include、扩展extend、泛化UML图、类图关系:范组局联谊(泛化、组合、聚合、关联、依赖)系统可靠性:冗余技术、软件容错技术(恢复块设计、N版本程序设计)、双机容错技术、集群技术软件可靠性:软件容错设计(恢复块设计、N版本程序设计)、检错设计和降低复杂度设计2.*基于架构的软件设计(ABSD)强调由商业、质量和功能需求的组合驱动软件架构设计。
它强调采用视角和视图来描述软件架构,采用用例和质量属性场景来描述需求。
用例描述的是功能需求,质量属性场景描述的是质量需求。
使用ABSD方法,设计活动可以从项目总体功能框架明确就开始。
ABSD方法有三个基础:第一个是功能分解,在功能分解中使用已有的基于模块的内聚和耦合技术。
第二个是通过选择架构风格来实现质量和商业需求。
第三个是软件模板的使用。
ABSD方法是一个自顶向下,递归细化的过程,软件系统的架构通过该方法得到细化,直到能产生软件构件的类。
完全函数依赖和部分函数依赖的定义好嘞,今天我们来聊聊数据库里的“完全函数依赖”和“部分函数依赖”!这两个概念听起来很高大上,好像是啥数学家才能搞得懂的东西,但其实说白了,它们就是帮我们整理数据,让它变得更加规范、清晰。
你知道吗?就像是你在厨房里做饭,没把所有的调料都摆好,弄得乱七八糟,吃起来一点也不好。
数据库也差不多,只有搞清楚这些“依赖”,才能让我们的数据好用又不容易出问题。
首先呢,我们来说说“完全函数依赖”这个东西。
别害怕,完全函数依赖其实就是我们生活中常常会遇到的情形——如果你想要知道某个信息,必须得依赖一组数据里的所有部分,缺一不可。
想象一下,你有个朋友,他跟你说他去参加聚会,结果问了你一句:“你知道我今天穿的那件T恤多少钱吗?”你一脸懵逼,心想:“你问我T恤多少钱?”结果他接着说:“不行,你得先告诉我我昨晚吃的那顿大餐花了多少钱,因为这两个东西有关联啊!”这就是完全依赖!你不能只知道一部分,你必须知道整体,才能得出正确的答案。
这就是数据库中的“完全函数依赖”:只有通过全部的“数据部分”才能确定某个字段的值,缺了哪一部分都不行。
举个例子吧,假设你有个学生成绩表,里面有“学号”和“课程”两个字段。
如果你只知道“学号”,就不能知道学生在某门课上的成绩,必须同时知道“学号”和“课程”,这俩数据合起来才能得出成绩。
这就是“完全依赖”,必须两者兼得,单独一个是没有用的。
再来说说“部分函数依赖”,这听起来是不是更复杂了?其实也没那么难理解,想想你去菜市场买水果,老板告诉你:“这些水果的价格已经固定了,如果你需要不同水果的价格,我就给你打个折。
”你一听,好像价格是跟某个特定的水果品种挂钩的,啥意思呢?你买个苹果,老板会告诉你价钱,买个橙子,又会给你不同的价格。
你看,单个水果的价格是可以通过部分的信息(比如水果种类)来决定的,而不是两者全都需要。
你可能会说,啥?这又是什么鬼?没错,就是这种情况,部分函数依赖就是指某个字段的值,只依赖于数据的部分信息,剩下的部分就可以忽略了。
函数依赖及范式函数依赖基本概念:•函数依赖:FD(function dependency),设有关系模式R(U),X,Y是U的子集,r 是R的任一具体关系,如果对r的任意两个元组t1,t2,由t1[X]=t2[X]导致t1[Y]=t2[Y], 则称X 函数决定Y,或Y函数依赖于X,记为X→Y。
X→Y为模式R的一个函数依赖。
•部分函数依赖:即局部依赖,对于一个函数依赖W→A,如果存在X W(X包含于W)有X→A成立,那么称W→A是局部依赖,否则称W→A为完全函数依赖。
•传递依赖:在关系模式中,如果Y→X,X→A,且X Y(X不决定Y),A X(A不属于X),那么称Y→A是传递依赖。
•函数依赖集F的闭包F+: 被逻辑蕴涵的函数依赖的全体构成的集合,称为F的闭包(clo sure),记为F+。
•最小依赖集:如果函数集合F满足以下三个条件(1)F中每个函数依赖的右部都是单属性;(2) F中的任一函数依赖X→A,其F-{X→A}与F是不等价的;(3)F中的任一函数依赖X→A,Z为X的子集,(F-{X→A})∪{Z→A}与F不等价。
则称F为最小函数依赖集合,记为Fmin。
函数依赖的公理系统:设有关系模式R(U),X,Y,Z,W均是U的子集,F是R上只涉及到U中属性的函数依赖集,推理规则如下:•自反律:如果Y X U,则X→Y在R上成立。
•增广律:如果X→Y为F所蕴涵,Z U,则XZ→YZ在R上成立。
(XZ表示X∪Z,下同) •传递律:如果X→Y和Y→Z在R上成立,则X→Z在R上成立。
以上三条为Armstrong公理系统•合并律:如果X→Y和X→Z成立,那么X→YZ成立。
•伪传递律:如果X→Y和WY→Z成立,那么WX→Z成立。
•分解律:如果X→Y和Z Y成立,那么X→Z成立。
这三条为引理注意:•函数依赖推理规则系统(自反律、增广律和传递律)是完备的。
•由自反律所得到的函数依赖均是平凡的函数依赖。
四种范式的含义:•如果某个数据库模式都是第一范式的,则称该数据库模式是属于第一范式的数据库模式。
模式分解的无损连接性之深入剖析1. 无损连接分解的形式定义无损连接分解的形式定义如下:设R是一个关系模式,F是R上的一个函数依赖(FD)集。
R分解成数据库模式δ={R1,……,Rk}。
如果对R中每一个满足F的关系r都有下式成立:那么称分解δ相对于F是“无损连接分解”,否则称为“损失连接分解”。
其中表示自然连接。
从上述形式定义中可知,若直接根据定义来判断某个分解是否具有无损连接性,那么就得“对R中每一个满足F的关系r”进行测试,看是否满足上面的等式,这显然不可操作,因为“对R中每一个满足F的关系r”进行测试就意味着“对R中所有满足F的关系r”进行测试,显然是不可能的。
这里所说的“关系”就是指一张具体的表。
因此,必须寻求其它的可操作性方法来判别分解的无损连接性。
2. 无损连接分解的普通判别方法——表格法设关系模式R=A1,…,An,R上成立的FD集F,R的一个分解p={R1,…,Rk}。
无损连接分解的判断步骤如下:(1)构造一张k行n列的表格,每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri(1≤i≤k)。
如果Aj在Ri中,那么在表格的第i行第j列处填上符号aj,否则填上符号bij。
(2)把表格看成模式R的一个关系,反复检查F中每个FD在表格中是否成立,若不成立,则修改表格中的元素。
修改方法如下:对于F中一个FD:X→Y,如果表格中有两行在X分量上相等,在Y分量上不相等,那么把这两行在Y分量上改成相等。
如果Y的分量中有一个是aj,那么另一个也改成aj;如果没有aj,那么用其中的一个bij替换另一个(尽量把ij改成较小的数,亦即取i值较小的那个)。
若在修改的过程中,发现表格中有一行全是a,即a1,a2,…,an,那么可立即断定p相对于F是无损连接分解,此时不必再继续修改。
若经过多次修改直到表格不能修改之后,发现表格中不存在有一行全是a的情况,那么分解就是有损的。
特别要注意,这里有个循环反复修改的过程,因为一次修改可能导致表格能继续修改。
数据库学习笔记-函数依赖及范式判断
⼀、基本概念
1、主码:⼜称为主键、主关键字,注意:主码是个能够唯⼀标识⼀条记录的最⼩属性集(是从候选码⾥⼈为挑选的⼀条)
2、关键字:⼜称为候选码;
3、候选关键字:候选码去掉主码剩下的部分即为候选关键字;
4、码=超键:唯⼀标识实体的属性或属性组合;
⼆、函数依赖
这⾥我选择使⽤我理解的⽅式⽤尽可能通俗的⽅式解释⼀下
完全函数依赖:码A完全依赖码B,则⽆论码B中有多少个属性,不能存在码B拆除了⼀部分还能决定码A的情况;
部分函数依赖:与完全函数依赖对应,就是码A依赖码B,把码B拆吧拆吧还能攒出来⼀个决定码A的⼩码B;
传递函数依赖:就是码A依赖码B,码C依赖码A,
类似这种可以接起来的情况:
B—> A, A —>C
如果A不决定B,那么就满⾜传递函数依赖(A决定B就变成直接依赖了)
三、关系范式基本概念
1NF:属性不可拆分——所有关系数据库中的关系都要满⾜第⼀范式
2NF:在第⼀范式基础上,
⾮主属性完全依赖主键(主码),即消除⾮主属性部分函数依赖;
3NF:在第⼆范式基础上,
⾮主属性不存在传递依赖候选键;
BCNF:在第三范式基础上,
主属性也消除掉传递依赖,即所有属性都不存在传递依赖;。
教你如何判断无损连接和函数依赖教你如何判断无损连接和函数依赖无损分解和保持依赖的判断大部分是对一个关系模式分解成两个模式的考察,分解为三个以上模式时无损分解和保持依赖的判断比较复杂,考的可能性不大,因此我们只对“一个关系模式分解成两个模式”这种类型的题的相关判断做一个总结。
以下的论述都基于这样一个前提:R是具有函数依赖集F的关系模式,(R1 ,R2)是R的一个分解。
首先我们给出一个看似无关却非常重要的概念:属性集的闭包。
令α为一属性集。
我们称在函数依赖集F下由α函数确定的所有属性的集合为F下α的闭包,记为α+ 。
下面给出一个计算α+的算法,该算法的输入是函数依赖集F和属性集α,输出存储在变量result 中。
算法一:result:=α;while(result发生变化)dofor each 函数依赖β→γ in F dobeginif β∈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的候选关键字。
数据库重难点(无损连接和范式)模式分解的几个重要事实:若只要求分解具有“无损连接性”,一定可以达到4NF;若要求分解要“保持函数依赖”,可以达到3NF,但不一定能达到BCNF;若要求分解既要“保持函数依赖”,又要具有“无损连接性”,可以达到3NF,但不一定能达到BCNF;试分析下列分解是否具有无损联接和保持函数依赖的特点:设R(ABC),F1={A→B} 在R上成立,ρ1={AB,AC}。
首先,检查是否具有无损联接特点:第1种解法--算法4.2:A B C AB a1 a2 b13 AC a1 b22 a3 A B C a1 a2 b13 a1 a2 a3(1) 构造表(2)根据A→B进行处理结果第二行全是a行,因此分解是无损联接分解。
第2种解法:(定理4.8)R1(AB)∩R2(AC)=AR2- R1=B∵A→B,∴该分解是无损联接分解。
然后,检查分解是否保持函数依赖πR1(F1)={A→B,以及按自反率推出的一些函数依赖}πR2(F1)={按自反率推出的一些函数依赖}F1被πR1(F1)所蕴涵,∴所以该分解保持函数依赖。
范式当查询涉及到针对“否定”特征含义的查询要求,如“不”、“没有”等字眼,一般要用差运算表示。
针对“全部”特征含义的查询要求,如“全部”、“至少”、“包含”等字眼,一般要用除法运算。
?1NF :R(A,B,C,D)依赖集(ab>c a->d) 因为d部分依赖于ab 所以属于1NF 不属于2NF 2NF :R(A,B,C,D)依赖集(ab>c c—>d)因为d传递依赖与AB 但是不存在部分依赖所以属于2N 不属3NF 3NF : R(A,B,C,D)依赖集(ab>c ab—>d,d->a) 因为即不存在部分依赖也不存在传递依赖所以属于3NF 但是因为d->a因为d是非主属性所以不属于BCNF1、第一范式(1NF):一个关系模式R的所有属性都是不可分的基本数据项。
解释平凡的函数依赖平凡的函数依赖是关系数据库中的一个概念,用于描述一个属性或属性集合对于关系中的其他属性的依赖关系。
在理解平凡的函数依赖之前,我们首先需要了解关系数据库和函数依赖的概念。
关系数据库是一种以表格的形式组织数据的数据库。
其中,每个表格被称为一个关系,每个关系都是由行和列组成的。
行被称为元组,表示一个实体,列则表示实体的属性。
关系数据库的主要特征之一是数据的无序存储。
在关系数据库中,函数依赖是一种描述关系中属性之间关系的概念。
它是指一个属性或属性集合对于其他属性具有决定性作用,即给定一个关系中满足一些条件的属性值,可以唯一确定其他属性的值。
在函数依赖中,有几个重要的概念需要了解:1.属性集合:在一个关系中,由一个或多个属性组成的集合。
2.函数依赖符号:函数依赖使用箭头“→”表示,左侧表示决定因素,右侧表示被决定的属性。
3.完全函数依赖:在一个属性集合中,如果任何一个属性去掉都不能决定其他属性,则称该函数依赖为完全函数依赖。
4.部分函数依赖:在一个属性集合中,任意一个属性都可以决定其他属性,则称该函数依赖为部分函数依赖。
了解了上述概念,我们再来解释平凡的函数依赖。
平凡的函数依赖是一种特殊的函数依赖,指的是一个属性或属性集合对于其他属性有决定性作用的情况。
在平凡的函数依赖中,被决定的属性实际上就是包含这个决定因素的属性本身。
举个例子来说明。
假设有一个关系R包含属性集合AB,且存在函数依赖AB→B。
在这个例子中,属性集合AB对于属性B有决定性作用,也就是给定属性集合AB的值,就可以唯一确定属性B的值。
这种情况下,我们称函数依赖AB→B为一个平凡的函数依赖,因为属性集合AB中的属性B自身就包含了属性B。
平凡的函数依赖在关系数据库中通常不是我们期望的,因为它并没有提供额外的信息。
在数据库设计中,我们更关注非平凡的函数依赖,也就是一个属性或属性集合对于其他属性有决定性作用,并且不存在包含该属性的超集所能决定其他属性的情况。
求最小函数依赖集分三步:1.将F中的所有依赖右边化为单一元素此题fd={abd->e,ab->g,b->f,c->j,cj->i,g->h};已经满足2.去掉F中的所有依赖左边的冗余属性.作法是属性中去掉其中的一个,看看是否依然可以推导此题:abd->e,去掉a,则(bd)+不含e,故不能去掉,同理b,d都不是冗余属性ab->g,也没有cj->i,因为c+={c,j,i}其中包含i所以j是冗余的.cj->i将成为c->iF={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};转换为3NF既具有无损连接性又保持函数依赖的分解算法:第一步:首先用算法1求出R的保持函数依赖的3NF分解,设为q={R1,R2,…,Rk}(这步完成后分解已经是保持函数依赖,但不一定具有保持无损连接)第二步:设X是R的码,求出p=q {R(X)}第三步:若X是q中某个Ri的子集,则在p中去掉R(X)第四步:得到的p就是最终结果例题:R(S#,SN,P,C,S,Z)F={S#→SN,S#→P,S#→C,S#→S,S#→Z,{P,C,S}→Z,Z→P,Z→C}•第一步:求出最小FD集:F={S# →SN, S# →P,S# →C, S#→S, {P,C,S→Z, Z →P,Z →C} // S# →Z冗余,FD:最小函数依赖按具有相同左部分组:q={R1(S#,SN,P,C,S), R2(P,C,S,Z), R3(Z,P,C)}R3是R2的子集,所以去掉R3q={R1(S#,SN,P,C,S), R2(P,C,S,Z)}•第二步:R的主码为S#,于是p=q {R(X)}={R1(S#,SN,P,C,S), R2(P,C,S,Z), R(S#)}•第三步:因为{S#}是R1的子集,所以从p中去掉R(S#)•第四步:p ={R1(S#,SN,P,C,S), R2(P,C,S,Z)}即最终结果判别一个分解的无损连接性举例2:已知R<U,F>,U={A,B,C,D,E},F={A→C,B→C,C→D,DE→C,CE→A},R的一个分解为R1(AD),R2(AB),R3(BE),R4(CDE),R5(AE),判断这个分解是否具有无损连接性。
数据库中无损连接减法首先了解一下几个概念:1)把一个关系模式分解成若干个关系模式的过程,称为关系模式的分解。
2)把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的。
3)只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义。
对于第一句话,为什么需要分解关系模式?因为原来的关系模式可能造成数据冗余或给数据库带来潜在的不一致性。
对于第二句话,根据不同语义,分解的原则也不尽相同,所以方法肯定是不唯一的,譬如U={A,B,C},根据不同原则(随便你自己定),可能分成(A,B)(A,C)也可能分成(B,C)(A,C)。
对于第三句话,则是本文所要讲的内容。
为了保证分解后的关系模式与原关系模式等价,我们要判定 1)分解后形成的行的关系模式中是否为无损连接 2)是否保持函数依赖一、无损连接的判定:1)如果分解后的的关系模式是形如{U1,U2}这,里面只有两个,那很好做,就判断或是否成立,成立的话肯定是无损连接。
2)如果是两个以上{U1,U2,U3.。
..}这种,那就比较麻烦了,比如,有属性集,ABCDEF,存在这样的函数依赖集{A—>;BC,CD—>;E,B—>;D,BE—>;F,EF—>;A},然后有这样的分解{ABC,BD,BEF}。
例如:设U1=ABC,U2=BD,U3=BEF,根据提供的函数依赖集,我们可得U1存在这样的函数依赖A—>;BC,U2上的函数依赖是 B—>;D, U3的函数依赖是BE—>;F。
1)于是可构造这样的表格。
GABCDEFA—>;BCB—>;DBE—>;Fd2)各自判断A,B,C,D,E,F是否有在G列的函数依赖中,如果有记为ai,i表示第几列,否则记为bji,表示第行第i列如:GABCDEFA—>;BCa1(A有在函数依赖中,此行为第一行)B—>;DBE—>;Fb31(A没有,此列为第一列)这样我们可得到图:GABCDEFA—>;BCa1a2a3b14b15b16B—>;Db21a2b23a4b25b26BE—>;Fb31a2b33b34a5a53)接下来是关键的,如果我们经过一系列变换得到有一行是这样的排序{a1,a2,a3,a4,a5,a6.。
教你如何判断无损连接和函数依赖
无损分解和保持依赖的判断
大部分是对一个关系模式分解成两个模式的考察,分解为三个以上模式时无损分解和保持依赖的判断比较复杂,考的可能性不大,因此我们只对“一个关系模式分解成两个模式”这种类型的题的相关判断做一个总结。
以下的论述都基于这样一个前提:
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。