文章目录

  • 前言
  • 为什么需要最小函数依赖集
  • 闭包
  • 最小函数依赖集
    • 定义
    • 解释
    • 算法
    • 举例
  • 写在最后

前言

在本文中,会介绍为什么要引入最小函数依赖集,最小函数依赖集是什么,以及如何求最小函数依赖集。

为什么需要最小函数依赖集

在关系数据模型中,一个关系通常由R(U,F)构成,U为属性的全集,F为函数依赖集。在实际生活中,我们可以根据语义来定义关系中属性的依赖关系,例如学号可以唯一确定一位学生的姓名、性别等等。但是,有时候给出的函数依赖集并不是最简的,这有时会拖累我们对关系的后续处理,例如关系的分解、判断是否为无损分解等。所以,我们在必要时,需要对函数依赖集进行化简,这就是需要最小函数依赖集的原因。
在正式介绍最小函数依赖集之前,还需要了解一个概念,那就是闭包。准确的说是属性集X关于函数依赖集F的闭包

闭包

闭包分为两种,一种是函数依赖集F的闭包,另外一种是属性集X关于函数依赖集F的闭包。前者不做讨论,重点说说后者。先来看定义

F为属性集U上的一组函数依赖集,XY ∈\in∈U,XF+X_F^+XF+​= {A|X→\rightarrow→A能由F根据Armstrong公理导出},XF+X_F^+XF+​称为属性集X关于函数依赖集F的闭包。

说白了,就是给定属性集X,根据现有的函数依赖集,看其能推出什么属性。
这里的Armstrong公理系统不用深究,想具体了解的可以点击查看百度百科。
举例:

已知关系模式R<U,F>,其中:
U = {A,B,C,D,E},
F = {AB →\rightarrow→ C,B→\rightarrow→D,C→\rightarrow→E,EC→\rightarrow→B,AC→\rightarrow→B}
求(AB)F+(AB)_F^+(AB)F+​。

解:

从AB出发,此时我们的集合里已经包含了{A,B}。
我们从现有的函数依赖集中可知,
AB可以推出C,于是C加入集合,
B可以推出D,于是D加入集合,
C可以推出E,于是E加入集合,
EC可以推出B,因为C、E、B都在集合中,于是不加入,
AC可以推出B,因为A、B、C都在集合中,于是不加入
至此,可求得(AB)F+(AB)_F^+(AB)F+​ ={A、B、C、D、E}。

最小函数依赖集

定义

如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集最小覆盖
(1)、F中任一函数依赖右部仅含有一个属性。
(2)、F中不存在这样的函数依赖 X→\rightarrow→A,使得FF-{X→\rightarrow→A} 等价。
(3)、F中不存在这样的函数依赖X→\rightarrow→AX有真子集Z使得F-{X→\rightarrow→A}⋃\bigcup⋃{Z→\rightarrow→A} 与F等价。

解释

以上定义翻译成大白话就是,一个函数依赖集F要想称为最小函数依赖集,要满足以下三点:
1、F中任一函数依赖的右边只有一个属性。
2、F中不存在这样的函数依赖:从现有的函数依赖集中删除一个函数依赖X→\rightarrow→A,删除后所得的函数依赖集与原来的函数依赖集等价,这样的函数依赖是不允许存在的。
3、F中不存在这样的函数依赖:假设函数依赖集中存在AB→\rightarrow→Y,现对该依赖的左部进行化简,即删除A,得B→\rightarrow→Y;或删除B,得A→\rightarrow→Y,若经过化简后的函数依赖集与没有化简前的函数依赖集等价,那么这样的函数依赖是不允许存在的。

算法

1、首先,先利用函数依赖的分解性,将函数依赖集中右部不为单个属性的分解为单属性。

2、对于经过第1步筛选后的函数依赖集F中的每一个函数依赖X→\rightarrow→A,进行以下操作:

  • 2.1、将X→\rightarrow→A从函数依赖中剔除
  • 2.2、基于剔除后的函数依赖,计算属性X的闭包,看其是否包含了A,若是,则该函数依赖是多余的(这里体现出前面说的等价,因为如果基于化简后的函数依赖依赖,计算X的闭包依然包含A,则说明A可以由其他依赖推出,X→\rightarrow→A不是必须的),可以删除,否则不能删除

3、对于经过第2步筛选后的函数依赖集F中每个左部不为单个属性的函数依赖AB→\rightarrow→Y,进行以下操作:
我们约定,经过第二步筛选后的函数依赖集记为F1,经过第三步处理后的函数依赖集为F2。

  • 3.1、去除A,得B→\rightarrow→Y,得F2,基于F1和F2计算属性B的闭包,如果二者相等,则说明它们是等价的,A可以去除;如果不相等,则A不能去除。
  • 3.2、去除B,得A→\rightarrow→Y,得F2,基于F1和F2计算属性A的闭包,如果二者相等则说明它们是等价的,B可以去除;如果不相等,则B不能去除。

知识链接:函数依赖的分解性
若X→\rightarrow→YZ,则X→\rightarrow→Y 且 X→\rightarrow→Z。

举例

关系模式R(U,F)中,U={A,B,C,D,E,G},F={B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→BC};求F的最小函数依赖集。

解:
1、首先根据函数依赖的分解性,对F进行第一次筛选,需要变动的有:
ADG→\rightarrow→BC拆解成ADG→\rightarrow→B、ADG→\rightarrow→C
得新函数依赖集:
F = {B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→B,ADG→\rightarrow→C}

2、筛选多余的函数依赖

  • 2.1:去除B→\rightarrow→D,得F = {DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→B,ADG→\rightarrow→C},BF+B_F^+BF+​ = {B},不包含D,故B→\rightarrow→D不删除。
  • 2.2:去除DG→\rightarrow→C,得F = {B→\rightarrow→D、BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→B,ADG→\rightarrow→C},(DG)F+(DG)_F^+(DG)F+​={D,G},不包含C,故DG→\rightarrow→C不删除。
  • 2.3:去除BD→\rightarrow→E,得F = {B→\rightarrow→D,DG→\rightarrow→C,AG→\rightarrow→B,ADG→\rightarrow→B,ADG→\rightarrow→C},(BD)F+(BD)_F^+(BD)F+​ = {B,D},不包含E,故BD→\rightarrow→E不删除。
  • 2.4:去除AG→\rightarrow→B,得F = {B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,ADG→\rightarrow→B,ADG→\rightarrow→C},(AG)F+(AG)_F^+(AG)F+​ = {A,G},不包含B,故AG→\rightarrow→B不删除。
  • 2.5:去除ADG→\rightarrow→B,得F = {B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→C},(ADG)F+(ADG)_F^+(ADG)F+​ = {A,D,G,C,B,E},包含B,故ADG→\rightarrow→B去除
  • 2.6:去除ADG→\rightarrow→C,得F = {B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B,ADG→\rightarrow→B},(ADG)F+(ADG)_F^+(ADG)F+​ = {A,D,G,C,B,E},包含C,故ADG→\rightarrow→C去除
    经过第二部筛选后,函数依赖集F变为{B→\rightarrow→D,DG→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B}。

3、化简函数依赖左侧不为单个属性的函数依赖

  • 3.1:先看DG→\rightarrow→C

    • 3.1.1:去除D,得G→\rightarrow→C,得函数依赖集F1 = {B→\rightarrow→D,G→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B}。
      基于F1,可求得GF+G_F^+GF+​ = {G,C}。
      基于F(第二步求出的,下同),可求得GF+G_F^+GF+​ = {G}
      可见二者并不相同,所以D不去除。
    • 3.1.2:去除G,得D→\rightarrow→C,得函数依赖集F1 = {B→\rightarrow→D,D→\rightarrow→C,BD→\rightarrow→E,AG→\rightarrow→B}
      基于F1,可求得DF+D_F^+DF+​ = {D,C}
      基于F,可求得DF+D_F^+DF+​ ={D}
      可见二者并不相同,所以G不去除。

综上,DG→\rightarrow→C,已是最简。

  • 3.2:再看BD→\rightarrow→E

    • 3.2.1:去除B,得D→\rightarrow→E,得函数依赖集F1 = {B→\rightarrow→D,DG→\rightarrow→C,D→\rightarrow→E,AG→\rightarrow→B}
      基于F1,可求得DF+D_F^+DF+​ = {D,E}
      基于F,可求得DF+D_F^+DF+​ = {D}
      可见二者并不相同,所以B不去除。
    • 3.2.2:去除D,得B→\rightarrow→E,得函数依赖集F1 = {B→\rightarrow→D,DG→\rightarrow→C,B→\rightarrow→E,AG→\rightarrow→B}
      基于F1,可求得BF+B_F^+BF+​ = {B,E,D}
      基于F,可求得BF+B_F^+BF+​ = {B,D,E}
      可见二者相同,所以D可以去除

综上,BD→\rightarrow→E,可化简为B→\rightarrow→E。

  • 3.3:最后看AG→\rightarrow→B

    • 3.3.1:去除A,得G→\rightarrow→B,得函数依赖集F1 = {B→\rightarrow→D,DG→\rightarrow→C,B→\rightarrow→E,G→\rightarrow→B}
      基于F1,可求得GF+G_F^+GF+​ = {G,B}
      基于F,可求得 GF+G_F^+GF+​ = {G}
      可见二者并不相同,所以A不可去除。
    • 3.3.2:去除G,得A→\rightarrow→B,得函数依赖F1 = {B→\rightarrow→D,DG→\rightarrow→C,B→\rightarrow→E,A→\rightarrow→B}
      基于F1,可求得AF+A_F^+AF+​ = {A,B}
      基于F,可求得AF+A_F^+AF+​ = {A}
      可见二者并不相同,所以G不可去除。

综上,AG→\rightarrow→B,已是最简。
综上,R的最小函数依赖集为F = {B→\rightarrow→D,DG→\rightarrow→C,B→\rightarrow→E,AG→\rightarrow→B}

写在最后

这个问题是我在考研复试的时候复习过程中遇到的,主要的纠结点在于第三步的判断上,查资料的时候发现网上很多都没有写清,最后还是在度娘的文库里找到了比较清楚的解释,在此做一下思路的整理。
本文定义以及例子参考自:

  • 《数据库系统概论(第五版)》 王珊 萨师煊 编著 清华大学出版社
  • CSDN 博文 数据库建模和设计(2):函数依赖、闭包、最小函数依赖集、范式、模式分解

关系数据库理论之最小函数依赖集相关推荐

  1. 【数据库】期末复习:SQL语句、关系代数的运算、范式的定义和判断、求最小函数依赖集、ER图转关系模式

    文章目录 SQL语句 查询select 其他 视图 关系代数的运算 并.差.笛卡尔积.投影和选择 连接 自然连接 笛卡尔积 详细版(如果完全不了解就看这里) 范式的定义和判断 如何求候选码 一些例题 ...

  2. 数据库期末考试预习之候选码,最小函数依赖集,3NF分解算法,判断第几范式

    一.候选码 参考链接:1 1.定义: 候选码(超级码)就是可以被选为主码的属性或属性组.当一个关系有N个属性或属性组可以唯一标识时,则说明该关系有N个候选码,可以选定其中一个作为主码. 候选码定义: ...

  3. 数据库常考题型(3)——求最小函数依赖集

    视频链接 https://www.bilibili.com/video/BV11F411K749/?spm_id_from=333.788&vd_source=467ab4c3cef3f6c7 ...

  4. 函数依赖集闭包、属性集闭包、超键、候选键和最小函数依赖集的求法。

    目录 关系模式 函数依赖的闭包 属性集闭包 码 求候选键算法 最小函数依赖集 关系模式R(U,D,DOM,F) R:关系名,符号化的元组定义 U:一组属性 D:属性组U中的属性所来自的域 DOM:属性 ...

  5. 最小函数依赖集的求解过程

    流程 ①先拆右边,假如依赖集F中的右边项包含不止一个属性,那么将这些项都拆为单个项.例如A->BC,拆分为A->B和A->C ②去除冗余依赖项,例如A->C和AB->C, ...

  6. 数据库求最小函数依赖集

    [例1]关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D},求F的最小依赖集. 第一步:将F中所有函数依赖的右边化为单一属性.得到F1={A→B,A→ ...

  7. 求函数依赖集F的最小覆盖

    求最小函数依赖集分三步: 1.将F中的所有依赖右边化为单一元素 此题fd={abd->e,ab->g,b->f,c->j,cj->i,g->h};已经满足 2.去掉 ...

  8. 数据库求最小函数依赖

    问:R<U,F>,U=ABCD,函数依赖集F={A→BD,AB→C,C→D},求F最小函数依赖集. 解: 1.将F中的所有函数依赖右边化为单一属性 F={A→B,A→D,AB→C,C→D} ...

  9. 主码求法,范式判断,最小函数依赖求法

    发现在模式分解这里还是有网络上的资源蛮少,讲这个东西的人蛮少.而且大家发表的文章,几乎是一模一样的,说的话,举得的例子.所以,写一个尽量让大家都能理解的方法.我现在就说一哈,书本上的定义,我自己的理解 ...

最新文章

  1. jdbc 变量 mysql_JDBC读写mysql总结
  2. 简简单单日赚200元,当日结算
  3. 连接关键词用什么符号
  4. 多线程之实现Runnable接口及其优点
  5. java反射机制浅谈
  6. 【BZOJ3894】文理分科
  7. 爬虫分页爬取猎聘_想把python爬虫了解透彻吗?一起盘它 ! !
  8. golang CI: Use result of type assertion to simplify cases SCC-S1034
  9. 学科实践活动感悟50字_“五育并举”的一次生动实践——洪雅实验中学研学活动感悟...
  10. C语言使用函数参数传递中的省略号:va_list, va_start, va_arg, va_end
  11. 回归网易 9 个月来的测试团队转型之路
  12. windowsR2(流媒体服务器)
  13. 怎样把pdf转换成word-多语言ocr支持
  14. 网易2017校园招聘数据挖掘笔试题
  15. 2023 Ai绘画 stable diffusion 笔记本配置硬件要求
  16. echarts 中国地图 世界地图
  17. 学会给你的笔记本电池换“芯”
  18. 腾讯面试:《警察抓小偷逻辑题》
  19. 从虚拟机VDI文件到物理磁盘分区的迁移方法
  20. 月报总结|11月份Moonbeam最新进展及大事一览~

热门文章

  1. Python之音频信号处理(一)音频基础知识
  2. 声音信号预处理matlab,实验一 MATLAB音频信号处理实验
  3. IIS错误页面隐藏版本信息 - Web.Config customErrors配置
  4. 用MFC做漂亮界面之登录界面
  5. QQ登录IE下iframe跨域session和cookie失效问题的解决方案
  6. 微信小程序 java在线租房-房屋租赁系统springboot
  7. Hadoop——实验七:MapReduce编程实践
  8. [转载自nylx的Blog]看看老外的开源项目
  9. 杨元原博士国密课堂 · 第一期 | 商用密码应用安全性评估:Part1. 密码算法概述
  10. apache一些参数  AllowOverride