前言

定义1:设R(U,F)是一个关系模式,F是函数依赖集,若F+^++= ( UUUi=1kFi)_{i=1}^{k}F_i)i=1k​Fi​)+^++,则R<U, F>的分解ρ={ R1<U1, F1>,R2<U2, F2>,…,Rk<Uk, Fk> } ,则分解ρ保持函数依赖。
定义2:分解前函数依赖的闭包和分解后各个函数依赖并集的闭包相等;即分解不能丢失函数依赖
保持函数依赖性判断完全可以根据定义及Armstrong公理进行判断。对于不能简单的推算出是否保持函数依赖,则需要通过以下算法实现。

判断算法

判断一个模式分解是否保持函数依赖,假设R(U,F)分解为R1(U1,F1)、R2(U2,F2)… Rn_nn​(Un_nn​,Fn_nn​)
其中:U1_11​∪∪∪U2_22​…∪∪∪Un_nn​=U,F1_11​、F2_22​、Fn_nn​分别是F在U1_11​、U2_22​…Un_nn​上的投影。处理步骤如:
第一步:设F’=F1_11​UF2_22​…UFn_nn​;判断F’是否覆盖了F,若包含了F中所有的函数依赖,则一定是保持函数依赖的,判断结束,否则进入第二步
第二步:对F’中没显式包含的函数依赖依据armstrong公理做初步判断,F’蕴含了该函数依赖,F’覆盖了该函数依赖。如不能判断得出,使用以下算法去实现,只要有一个函数依赖没有覆盖的到,则不保持函数依赖。是否蕴含了某个函数依赖判断的算法如下:

假设:需要判断是否蕴含了ααα->βββ函数依赖;
令 Result=ααα
开始扫描Ri_ii​,T=(Result∩R∩R∩Ri_ii​)F+_F^+F+​∩Ri
令:Result=Result∪∪∪T
Result包含了βββ,则:ααα->βββ成立,算法终止
Result有变化,但还没包含βββ,继续下一轮
Result无变化,且不包含βββ,则:ααα->βββ不成立,分解不覆盖ααα->βββ,说明不保持函数依赖

示例

例1:已知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),判断这个分解是否具有函数依赖性。
解:
求投影:R1_11​ F1_11​{A—>D} ,R2_22​ F2_22​{ØØØ} ,R3_33​ F3_33​{ØØØ},R4_44​(CDE), F4_44​(DE->C,C->D}
F’=F−-−(F1_11​UF2_22​UF3_33​UF4_44​)={A->D、DE->C,C->D}
A->C、B->C、CE->A这些函数依赖需要进一步的判断是否被覆盖到

根据Armstrong公理简单判断不出,F’是否蕴含了A->C、B->C、CE->A等函数依赖

转入求闭包操作:
A->C:
第一轮
令: Result={A}
Result与R1求交,为{A}, 求A的闭包:AF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R1_11​={AD}; Result= Result∪∪∪T={AD}
Result与R2求交,为{A}, 求A的闭包:AF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R2_22​={A}; Result= Result∪∪∪T={AD}
Result与R3求交,为{ØØØ}, Result= Result∪∪∪T={AD}
Result与R4求交,为{D}, 求D的闭包:DF+_F^+F+​={D}, 则T={D}∩∩∩R4_44​={D} Result= Result∪∪∪T={AD}
Result与R5求交,为{A}, 求A的闭包:AF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R5_55​={A} Result= Result∪∪∪T={AD}
第一轮,开始Result={A},最后得到Result={AD},Result发生变化,开始第二轮
第二轮
此时, Result={AD}
Result与R1求交,为{AD}, 求AD的闭包:ADF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R1_11​={AD}; Result= Result∪∪∪T={AD}
Result与R2求交,为{A}, 求A的闭包:AF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R2_22​={A}; Result= Result∪∪∪T={AD}
Result与R3求交,为{ØØØ}, Result= Result∪∪∪T={AD}
Result与R4求交,为{D}, 求D的闭包:DF+_F^+F+​={D}, 则T={D}∩∩∩R4_44​={D} Result= Result∪∪∪T={AD}
Result与R5求交,为{A}, 求A的闭包:AF+_F^+F+​={ACD}, 则T={ACD}∩∩∩R5_55​={A} Result= Result∪∪∪T={AD}
第二轮,开始Result={AD},最后得到Result={AD},Result无变化且Result不包含C,不能覆盖A->C,无需做其他两个验证了。
所以:此模式分解不保持函数依赖性。

例2:给定关系模式R(U,F),U={A,B,C,D} F={A->B, B->C, C->D, D->A}
分解为R1:{AB}、R2{BC}、R3{CD},判断此分解是否具有依赖保持性
解:求投影
R1_11​ F1_11​{A->B,B->A} ,
R2_22​ F2_22​{C->B,B->C} ,
R3_33​ F3_33​{C->D,D->C},
F’=(F1_11​UF2_22​UF3_33​UF4_44​)={A->B,B->A,C->B,B->C,C->D,D->C}
缺少: 函数依赖D->A;
DF′+_F'^+F′+​={DCBA};表示F’蕴含了D->A,F’与F是等价的;所以保持函数依赖性
完毕。

我们可以使用第三步方法再验证一下F’是否蕴含了D->A
第一轮
令: Result={D}
Result与R1求交,为{ØØØ}, 求ØØØ的闭包得到ØØØ,T={ØØØ}∩∩∩R1_11​={ØØØ}; Result= Result∪∪∪T={D}
Result与R2求交,为{ØØØ}, 求ØØØ的闭包得到ØØØ,T={ØØØ}∩∩∩R2_22​={ØØØ}; Result = Result∪∪∪T={D}
Result与R3求交,为{D}, 求D的闭包,DF+_F^+F+​={ABCD},T={ABCD}∩∩∩R3_33​={CD}; Result= Result∪∪∪T={CD}
由于最后的Result={CD}和最初的Result={D}不同,我们开始第二轮
第二轮
Result={CD}
Result与R1(AB)求交,为{ØØØ}, 求ØØØ的闭包得到ØØØ,T={ØØØ}∩∩∩R1_11​={ØØØ}; Result= Result∪∪∪T={CD}
Result与R2(BC)求交,为{C}, 求C的闭包CF+_F^+F+​={ABCD},T={ABCD}∩∩∩R2_22​={BC}; Result= Result∪∪∪T={BCD}
Result与R3(CD)求交,为{CD}, 求CD的闭包,DCF+_F^+F+​={ABCD},T={ABCD}∩∩∩R3_33​={CD}; Result= Result∪∪∪T={BCD}
由于最后的Result={BCD}和最初的Result={CD}不同,我们开始第三轮
第三轮
Result={BCD}
Result与R1(AB)求交,为{B}, 求B的闭包BF+_F^+F+​={ABCD},T={ABCD}∩∩∩R1_11​={AB}; Result= Result∪∪∪T={ABCD}
此时:result已经包含了A,说明F’是否蕴含了D->A
F’与F等价,保持函数依赖性。

结论

保持函数依赖性,就是做模式分解后的F’(各个子模式函数依赖的并集)是否与F(原有的函数依赖集)等价,F’包含所有的F中的函数依赖则可以得出保持函数的依赖性(充分条件),如果F’不显式包含F中的函数依赖,还需进一步判断,判断方法有两条,第一种是通过F’中的属性闭包去求,是否蕴含函数依赖(这种方法要求做函数投影时,不能缺项);第二种使用给定的算法去求,对投影要求简单,但过程特别麻烦。

模式分解保持函数依赖判断——数据库考试复习相关推荐

  1. 候选码求解算法——数据库考试复习

    前言 定义:设K为关系模式R<U, F>中的属性或属性组.若U完全依赖K,则K称为R的一个候选码(Candidate Key).换句话说,R中所有属性完全依赖于K,不存在K'是K的真子集, ...

  2. 【数据库复习】 模式分解例题

    关于模式分解的相关例题:即判断分解是否保持无损连接,以及是否保持函数依赖: 题目来源:MOOC网-战德臣数据库课程 参考视频:B站浙江大学陈岭数据库系统原理 1.给定关系模式R(U, F),其中U={ ...

  3. 【数据库系统设计】关系数据理论(函数依赖、码、范式、模式分解)

    关系数据理论 6.1 为什么要学习关系数据理论 什么是好的数据库逻辑设计 什么是数据依赖 关系模式的简化表示 6.2 规范化 - 关系的规范化理论 6.2.1 函数依赖 1.函数依赖 2.平凡函数依赖 ...

  4. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(1)

    数据库应用--在线考试复习资料 一.单选题 1."表达式生成器"是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符 ...

  5. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料

    数据库应用--在线考试复习资料 一.单选题 1."表达式生成器"是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符 ...

  6. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(3)

    数据库应用--在线考试复习资料 一.单选题 1."表达式生成器"是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符 ...

  7. 数据库中的模式分解与无损连接性

    无损连接分解的普通判别方法--表格法 设关系模式R=A1,-,An,R上成立的FD集F,R的一个分解p={R1,-,Rk}.无损连接分解的判断步骤如下: (1)构造一张k行n列的表格,每列对应一个属性 ...

  8. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(4)

    数据库应用--在线考试复习资料 一.单选题 1."表达式生成器"是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符 ...

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

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

  10. 函数依赖和关系模式分解

    文章目录 一,第一范式 二,关系数据库设计中易犯的错误 2.1 数据冗余 2.2 插入.删除.修改异常 三,模式分解(I) 四,函数依赖(FD) 4.1 什么是函数依赖 4.2 函数依赖的使用 4.3 ...

最新文章

  1. Redis初学:9(Zset类型)
  2. 提升工作沟通,你需要明白这些内容
  3. python方法测试_python 测试常用小方法
  4. python各种模块的使用
  5. 推荐大赛如何在一周时间内打进决赛
  6. 互联网1分钟 | 0121 Vlog陌生人社交APP「自言」为年轻人打造生活视频分享平台;周鸿祎:智能设备要警惕“海豚音攻击”...
  7. Kubernetes探针踩坑记
  8. 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数
  9. Per-class allocator 1
  10. 【转】Sections Headers for Android ListViews
  11. 去掉GaussView 3.07启动警告窗口的完整解决方案
  12. 微信小程序开发入门教程
  13. 教师招聘面试视频 计算机,怎么准备教师招聘面试试讲?(附视频)
  14. 华三交换机配置telnet远程登录和http、https登录
  15. Android 跳转到第三方应用(应用间的跳转)
  16. Coinlist要闻:即将到来的以太坊合并的风险有多大?
  17. 南方科技大学计算机图灵奖,南方科技大学到底算什么级别啊?
  18. php开发c盘多大,win10占用c盘多大空间
  19. 如何判断一个用户是否在O365上还是本地Exchange服务器上
  20. 多层混合结构信息系统中间件MBCS的设计与开发

热门文章

  1. Django (十一) 项目部署 2
  2. shader篇-动画
  3. STM32-端口复用和重映射
  4. PAT 甲级 图形输出 1031 Hello World for U (20 分)
  5. ARM TrustZone技术简介
  6. ARM Cortex-A 系列处理器天梯图
  7. C语言入门:查找子串
  8. 字母易位词(anagram)
  9. 第12周 上机报告 1之练习3 回文日
  10. windows7如何安装python_windows7系统下如何安装python