热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

database_无损联接分解

本文出自“李骥平”博客,请务必保留此出处http:fsjoy.blog.51cto.com318484137130定义:无损联接分解是将一个关系模式分解


本文出自李骥平博客,请务必保留此出处



http://fsjoy.blog.51cto.com/318484/137130




 


定义:无损联接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损联接分解。



  



1:关系模式:成绩(学号,姓名,课程号,课程名,分数)



函数依赖:学号->姓名,课程号->课程名, (学号,课程号)->分数



若将其分解为下面三个关系模式:



 



成绩(学号,课程号,分数)



学生(学号,姓名)



课程(课程号,课程名)



问,这样的分解是无损分解么?



----



由于:学号->姓名,所以:



成绩(学号,课程号,分数,姓名)



由于:课程号->课程名,所以:



成绩(学号,课程号,分数,姓名,课程名)



 



所以这个例子是无损分解



 



2:R=ABCDE, R1=AD,R2=BC,R3=BE,R4=CDE, R5=AE, 设函数依赖:



A->C, B->C, C->D, DE->C, CE->A. 判断R分解成



 



ρ={R1,  R2,  R3,  R4,  R5}是否无损联接分解?



 



解:



这样的题要通过画表的方法来解,首先,原始表:



 




 

A

B

C

D

E

AD

a1

b12

b13

a4

b15

BC

b21

a2

a3

b24

b25

BE

b31

a2

b33

b34

a5

CDE

b41

b42

a3

a4

a5

AE

a1

b52

b53

b54

a5



1



(A B C D E是关系R的属性, AD, BC, BE, CDE, AE 是分解之后每一个关系对应的属性集)




 


填表的过程:



当横竖相交的时候,如果在分解关系中存在对应列的单个的属性(譬如第一列第一行ADA相交的单元格,AD含有A,就填写a1),则填写a下标 , 下标就是单元格对应所在的列号。否则填写b下标, 下标是单元格对应所在的行列号。



填写之后的初始表就是表1所示



2.根据依赖关系修改原始表:



对于依赖关系A->C,看A列中有两行a1是相等的(第一行和第五行),所以在C列中对应的两行也应该相等,但是看到这两行都是b(b13,b53),所以将这个b都换成b13(上面的较小的标)




 



 

A

B

C

D

E

AD

a1

b12

b13

a4

b15

BC

b21

a2

a3

b24

b25

BE

b31

a2

b33

b34

a5

CDE

b41

b42

a3

a4

a5

AE

a1

b52

b53àb13

b54

a5



对于依赖BàC, 同样的道理,看B这一列中,第二行和第三行都是a2,那么对C这一列同样的操作,但是看到C这一列中第二行是a3,那么就将第三行改成a3,优先级比b要高。




 

A

B

C

D

E

AD

a1

b12

b13

a4

b15

BC

b21

a2

a3

b24

b25

BE

b31

a2

b33àa3

b34

a5

CDE

b41

b42

a3

a4

a5

AE

a1

b52

b13

b54

a5




 


对依赖CàD,C列的1,5行相等,D1,5行也应该相等,D的第1行有a,所以b54换成a4;另外C列的2,3,4行也相等,D2,3,4行也应该相等,D的第4行有a,所以将对应的行都换成a4




 

A

B

C

D

E

AD

a1

b12

b13

a4

b15

BC

b21

a2

a3

b24àa4

b25

BE

b31

a2

a3

b34àa4

a5

CDE

b41

b42

a3

a4

a5

AE

a1

b52

b13

b54àa4

a5




 



 


对于DEàC, DE公共的相等的行是3,4,5行,对应C3,4,5行也应该相等,故将C列的两个的b13换成a3,所以表格经过这个函数依赖关系,就是:




 

A

B

C

D

E

AD

a1

b12

b13àa3

a4

b15

BC

b21

a2

a3

a4

b25

BE

b31

a2

a3

a4

a5

CDE

b41

b42

a3

a4

a5

AE

a1

b52

b13àa3

a4

a5




 



 


对于CEàA, CE的公共行是3,4,5行,所以将A3,4,5行也对应相等,因为A列的第五行含有a1,所以将3,4行的b31,b41都换成a1



 clip_image001



最终得到的表格就是:



 



clip_image002



 最后,我们从表格里看到对于DE行来说,都是a,所以得出结论,题中的分解是无损联接分解



 



********************



 



无损分解的一个简便的判别方法(适用于分解成2个关系的情况)



 



譬如:



有关系R=ABC, 依赖关系{A-->B}那么下面哪个是无损分解:



 



A. {R1(AB),R2(AC)}



B.{R1(AB),R3(BC)}



 



首先看选项A,R1R2=A,R1-R2=B,R1U R2-->(R1-R2).所以它是无损分解



选项B, R1R2=B, R1-R2=A, R2-R1=C,



所以它不是无损分解



 



那么这里快速判断无损分解的方法就是



对两个集合先求集合的,然后求集合的差(2个集合有两个差的结果)



如果集合的-->集合的差(得到差结果的任意一个)成立那么就是无损分解



本文出自李骥平博客,请务必保留此出处http://fsjoy.blog.51cto.com/318484/137130



本文出自 51CTO.COM技术博客




 



 



 


转载于:https://www.cnblogs.com/xyjcn/archive/2010/07/01/1769517.html



推荐阅读
  • 本文详细介绍了如何使用ActionScript 3.0 (AS3) 连接并操作MySQL数据库。通过具体的代码示例和步骤说明,帮助开发者理解并实现这一过程。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 在即将迎来26岁生日之际,作者的人生陷入了低谷。经过近三年的硕士学习后,最终决定退学,并且面临没有工作经验的困境。尽管如此,作者依然坚定地选择为自己的人生负责。 ... [详细]
author-avatar
青春快乐1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有