无损连接分解的普通判别方法——表格法

  设关系模式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的情况,那么分解就是有损的。特别要注意,这里有个循环反复修改的过程,因为一次修改可能导致表格能继续修改。

  修改过程中要特别注意,若某个bij被改动,那么它所在列的所有bij都需要做相应的改动。为了明确这一点,举例说明。例如,我们根据FD“H→I”、“ K→L”来修改表格之前时的表格如表1所示(已经过多次修改,非初始表,空的单元表示省略):

  表1

H

I

J

K

L

R1

b12

b35

R2

a1

a2

a4

b25

R3

a1

b12

a4

b35

R4

b12

b35

  R2、R3所在行的H分量都为a1,根据FD“H→I”,需要修改这两行对应的I分量,而R2所在行的I分量为a2,因此,要将R3所在行的I分量b12修改为a2,注意到,R1、R4所在行的H分量也为b12,因此,这两行对应的I分量也必须修改为a2。R2、R3所在行的K分量都为a4,根据FD“K→L”,需要修改这两行对应的L分量,于是将R3所在行的L分量b35修改为较小的b25,同时注意到,R1、R4所在行的L分量也为b35,因此,这两行对应的L分量也必须修改为b25。修改后的表格如表2所示:

  表2

H

I

J

K

L

R1

a2

b25

R2

a1

a2

a4

b25

R3

a1

a2

a4

b25

R4

a2

b25

  【例题】(软件设计师2002年上午试题38)

  设关系模式 R为 R(H,I,J,K,L),R上的一个函数依赖集为 F={H→J,J→K,I→J,JL→H},分解 (38) 是无损连接的。

  供选择的答案:

  (38) A. p={HK,HI,IJ,JKL,HL} B. p={HIL,IKL,IJL}

  C. p={HJ,IK,HL} D. p={HI,JK,HL}

  试题分析:

  根据上述判断方法,我们列出选项B(分解成三个关系模式R1(HIL)、R2(IKL)、R3(IJL) )的初始表如表3所示:

  表3选项B的初始表

H

I

J

K

L

HIL

a1

a2

b13

b14

a5

IKL

b21

a2

b23

a4

a5

IJL

b31

a2

a3

b34

a5

  对于函数依赖集中的H→J、J→K对表3进行处理,由于属性列H和属性列J上无相同的元素,所以无法修改。但对于I→J在属性列I上对应的1、2、3行上全为a2元素,所以,将属性列J的第一行b13和第二行b23改为a3。修改后如表4所示:

表4选项B的中间表

H

I

J

K

L

HIL

a1

a2

a3

b14

a5

IKL

b21

a2

a3

a4

a5

IJL

b31

a2

a3

b34

a5

  对于函数依赖集中的JL→H在属性列J和L上对应的1、2、3行上为a3、a5元素,所以,将属性列H的第二行b21和第三行b31改为a1。修改后如表5所示:

  表5选项B的结果表

H

I

J

K

L

HIL

a1

a2

a3

b14

a5

IKL

a1

a2

a3

a4

a5

IJL

a1

a2

a3

b34

a5

  从表5可以看出,第二行为a1、a2、a3、a4、a5,所以分解p是无损的。

  有一种特殊情况要注意:分解后的各个关系模式两两均无公共属性。由于是模式分解,那么任一一个分解后的关系模式覆盖的属性集不可能是分解前的整个全部属性U,因此初始表中不存在全是a的行。又注意到,分解后的各个关系模式两两均无公共属性,表明任两行在任一列上都没有相同的分量,这导致整个表格无法修改,保持初始状态。而初始状态不存在全是a的行,因此这种特殊情况的分解是有损的。

  例如,函数依赖集合FD,将关系模式R(ABCDEF)分解成R1(AB)、R2(CDE)、R3(F),那么这种分解肯定是有损的。考试中可能碰到这种情况,那么一眼就可以判断出结果,从而节省了时间。

  3.无损连接分解的快捷判别方法

  首先要申明,这种快捷方法是有前提的,前提就是分解后的关系模式只有两个。其内容为:

  设ρ={R1,R2}是R的一个分解,F是R上的FD集,那么分解ρ相对于F是无损分解的充分必要条件是:(R1∩R2)→(R1–R2)或(R1∩R2)→(R2–R1)。这个“或”字很重要,这里表示(R1∩R2)→(R1–R2)、(R1∩R2)→(R2–R1)中只要有一个成立就行。这里的求交和相减运算的对象是关系模式的属性。

  【例题】

  关系模式R(U,F),其中U={W,X,Y,Z},F={WX→Y,W→X, X→Z,Y→W}。那么下列分解中是无损分解的是。

  供选择的答案:

  A.p={R1(WY),R2(XZ)} B.p={R1(WZ),R2(XY)}

  C.p={R1(WXY),R2(XZ)} D.p={R1(WX),R2(YZ)}

  试题分析:

  A选项,R1∩R2为空,肯定不满足条件。

  B选项,R1∩R2为空,肯定不满足条件。

  C选项,R1∩R2={X},R1-R2={WY},R2-R1={Z},根据函数依赖集,X→Z成立,所以满足条件。

  D选项,R1∩R2为空,肯定不满足条件。

  4.总结

  模式分解无损性判别的源泉仍然是普通的表格法。这种快捷方法只不过是根据这种表格法推断出来的而已,是它的一个特列。但是这种快捷方法却往往非常有用。

数据库中的模式分解与无损连接性相关推荐

  1. 模式分解的无损连接性之深入剖析

    1.无损连接分解的形式定义 无损连接分解的形式定义如下:设R是一个关系模式,F是R上的一个函数依赖(FD)集.R分解成数据库模式δ={R1,--,Rk}.如果对R中每一个满足F的关系r都有下式成立: ...

  2. 数据库基础理论二——模式分解为主要导向

    前言: 正确合情的理论是指导实践的重要法宝.在社会实践中,我们往往会感受到社会生产与理论发展有些许的不一致性,当然,理论与实践之间往往具有一道鸿沟.但是,当我们从社会经济学的角度去审视技术理论与泛化的 ...

  3. 数据库系统概论:判别一个分解的无损连接性

    1. 无损连接定义 无损连接是指分解后的关系通过自然连接可以恢复成原来的关系,即通过自然连接得到的关系与原来的关系相比,既不多出信息.又不丢失信息. 2. 判别无损连接的方法 定理判别(适合关系模式R ...

  4. 判别一个分解的无损连接性

    算法:ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是关系模式R<U,F>的一个分解,U={A1,A2,...,An},F= ...

  5. 数据库概论之模式分解理论(理解简单明了)

    模式分解理论 模式分解: 模式分解的概念: 模式分解的特性: 数据内容的等价性: 数据约束的等价性 模式分解要考虑的问题: 模式分解的分类: 无损连接分解: 无损连接分解概念: 无损连接分解的检验算法 ...

  6. 判断分解的无损连接性

    算法 ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是关系模式R<U,F>的一个分解,U={A1,A2,...,An},F= ...

  7. 一、判别一个分解的无损连接性

    判别一个分解的无损连接性   算法的文字描述为: 算法的伪代码描述为:   例题解析 对于分解为两个关系模式的情况,有如下的定理:  

  8. MySQL的关系模式集是什么_数据库中“关系模式”的定义是什么?

    展开全部 数据库中"关系模式"的定义是对关系的描述,其必须指出这个元组集合的结构,也就是它32313133353236313431303231363533e4b893e5b19e3 ...

  9. 知识分享之PostgreSQL——数据库中的模式(Schema)

    知识分享之PostgreSQL--数据库中的模式(Schema) 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列 ...

最新文章

  1. Linux下nginx支持.htaccess文件实现伪静态的方法!
  2. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
  3. python django django-debug-toolbar 加载缓慢,不能使用。
  4. 神奇的JavaScript之正则
  5. C++ smart pointer
  6. 利用dispatch_once创建单例
  7. 微软工程师测试题——未来
  8. 转-Kafka【第一篇】Kafka集群搭建
  9. java.lang.NoClassDefFoundError:如何解决–第2部分
  10. Linux memcached
  11. java icon动态变换,以编程方式自动更改ImageIcon [Java]
  12. 【C语言】scanf()输入浮点型数据
  13. PyCharm注册码
  14. opencv-python 测试FPS
  15. python 批量打印PDF(转)
  16. 线性代数1:向量、线性组合、张成的空间和基
  17. 最新款iPad,真香!!
  18. 全面保护个人电脑中的宝贵数据和文件(转)
  19. QMS-云质-质量管理软件-闲聊霍尼韦尔用13亿美元收购一家质量管理软件(QMS)小公司
  20. RobotStudio教程:ABB机器人拆垛与码垛应用示教编程与虚拟仿真

热门文章

  1. tlab java_浅析java中的TLAB
  2. java数组有跨类建立对象_必会的 55 个 Java 性能优化细节!一网打尽!
  3. android 获取应用列表,获取全部应用列表
  4. 大学计算机基础python学多久_基于Python 的“大学计算机基础”课程教学设计
  5. java英文版怎么汉化_请问,java中,将下面的英文名字变为中文 该怎样输出?
  6. linux用户组chownd,Linux系统centos6下用户与用户组权限命令用法 chmod与chown
  7. python之异常处理_Python之异常处理
  8. python文件对象是可以迭代的_详解python可迭代对象、迭代器和生成器
  9. mac ssh客户端_Electerm for Mac(ssh客户端)
  10. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...