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

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

主码的求法:

L为只在左边出现的属性
R为只在右边出现的属性
N为左右都没有出现的属性
LR为左右都出现的属性

1.只在FD右部出现的属性,不属于候选码;
2.只在FD左部出现的属性,一定存在于某候选码当中;
3.外部属性(N)一定存在于任何候选码当中;
4.其他属性(LR)逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。
一旦你执行到第4步的时候,证明此时候选码将可能不止一个了,请务必小心!!!

原文连接:https://blog.csdn.net/weiyongle1996/article/details/73481163

NF的判断:

1NF:第一范式:列不可分。每一列都是不可分割的基本数据项。
1NF是关系型数据库的基本的要求。如果连这个都不满足的话,就不能称为关系型数据库

2NF:在1NF的基础上,对于多关键(就是说主码不是一个属性,而是一个属性组)字表,
非主属性不能部分依赖于主键(eg:只依赖某个主键);对于单关键字表,不存在
部分依赖情况(只依赖一个主键,全部依赖),全符合。
举个例子:F={AB->C,A->D,B->E},那么主码为AB,但是A->D,D仅仅依赖于主码的部分属性A,所以,不满足2NF.
所以总结可以知道,如果所有的候选码都只有一个属性,那么他起码是2NF

3NF:在2NF的基础上,非关键字段对任一主键不能传递函数依赖。
非主键列必须直接依赖于主键,不能传递依赖。即不能存在:
非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
总之,非主键列之间不能存在依赖关系。
也就是说,如果非主属性之间存在依赖关系,那么就不是3NF
举个例子:F={X->Y,X->Z,Y->Z};可以看出,主码为X,但是存在非主属性Z对非主属性Y的依赖,所以不满足3NF.
后来我还发现一种这样的情况,假设主码位AB,现在又这样一个函数依赖F={AB->C,AC->D};你看,对于函数依赖AC->D,到底算不算非主属性对码的传递函数依赖呢?这个我也没有问老师,在网路上也没有找到答案,但是从做题的结果来看,这个也是属于3NF的。

BCNF:
方式1:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖。
  	  即不存在关键字段决定关键字段的情况。往往不满足BCNF的就是因为表中的候选码不止一个。
方式2:对于我在书本上面看到的说法,意思就是说如果这个3NF后,该模式下的每一个函数依赖左边
      都含有全部的候选码,就可以视为BCNF
      举个例子:(S,T)->T,(S,T)->J,T->J。可以看到,这里例子中(S,J)和(S,T)都是候选码,
      但是在函数依赖T->J中,左边没有包含任一候选码(是(S,J)或者(S,T))。
      所以,该模式不能称为BCNF
  
  判断关系R的NF,会综合主码的求法!

原文链接:https://blog.csdn.net/xuxurui007/article/details/7738330

最小函数依赖的求法:

步骤:
① 用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
② 去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭	包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖; 
③ 去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A属于(X)+,则Y是多余属性,可以去掉。
注意:最小函数依赖并不是唯一的!
第一步保证了Fm的每一个依赖的右边都是单个属性
第二步保证了Fm中没有多余的函数依赖
第三步保证了Fm中每个函数依赖的左边没有多余的属性

原文链接:https://www.zhihu.com/question/21235096

====================================================================

模式分解的无损连接判断

        无损连接的定义:是指对关系模式分解之后,原关系模式下的任一合法的关系实例在分解之后能通过自然连接运算恢复起来。
在这里插入图片描述
         我觉得主要就是注意一个问题就是:这里也说了,是循环的对F中的函数依赖一个一个修改,直到表中的有一行不能被修改为止或者有一行全部都是a1,a2…an。我一开始就是没有注意到这个循环这个问题。不能说,你将函数依赖用完一遍后,发现没有一行全部都是a1,a2…an,那么就认为这个不是无损连接的分解。可能我这么说,大家可能还不能理解。我记得我的老师在讲这个问题的时候,问我们:“这个方法是不是和你使用函数依赖的顺序有关?”因为你仅仅使用一遍这个函数依赖,就是会和使用函数依赖的顺序有关。但是,循环使用是没有这个问题的。

         判断是不是无损连接的还有一个方法,但是局限性在于分解后只能是二元关系,也就是是只能分解为R1,R2两个关系。这个我们老师上课的时候也讲过这个方法,我当时就仅仅记录了一点而已,理解还不是特别深刻。
在这里插入图片描述
在这里插入图片描述
这里的使U1就是SA,U2就是SIP。A还可以等于U2-U1

模式分解的保持函数依赖判断

         这个我没有看到标准的定义,所以,直接给出一个例题,然后来通过例题分析。
在这里插入图片描述
可以看到R1关系中的函数依赖从F中找不到,所以为空集。R2中的函数依赖就有:ZIP->CITY.也就是说,分解后的R1,R2中仅仅只有一个函数依赖ZIP->CITY,丢失了(CITY,ST)->ZIP这个函数依赖。所以,不满足函数依赖保持性。
       通过这个例题可以看到,分解的时候,可能有一个关系就会使其函数依赖为空集。至于为什么会出现这样的事情,以及其实际含义是什么,我还不知道。如果大家知道的话,欢迎留言交流。我总结的模式分解会带来的函数依赖有三种。第一:就是原来F中就可以找到的函数依赖;第二:可以通过原来F中的函数依赖推导出来到函数依赖;第三:没有函数依赖,为空集。
       至于无损连接性大家可以使用上面的判断无损连接的第二个方法,比较快速的就可以判断出来了!

转化为3NF的保持函数依赖分解

教科书算法:

在这里插入图片描述
在这里插入图片描述

我的归纳:

①:首先将该模式下的函数依赖F转化为最小的函数依赖Fm
②:然后看看有没有N类属性。也就是说,有没有U中有的属性,在F中一次都没有出现的。 如果有这样的属性,得将他们单独作为一个分解关系。
e.g:有U={A,B,C,D,E},F={AB->C}.可看到,在U中有属性D,E在函数依赖F中一次都没有出现过。 所以,将R1={DE}作为一个分解关系
③:对Fm具有相同左部的原则来分解
e.g:就是上面的例子,R1={DE},R2={ABC},所以p={R1(DE),R2(ABC)}

例题分析:

         例1:U=(A,B,C,D,E,G) F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D} 若R不是3NF,将R分解保持函数依赖的3NF。
         因为过程想要写的详细一点,所以下面我就使用草稿本来做这个题目。
在这里插入图片描述
这个题目因为没有N类属性,所以有一个情况的用法可能就没有方法展示,但是基本上大家可以通过看例题的解答过程来解决了!

        总结一下,为什么算法要这样设计。理解了之后,有利于知识由点转化为面。这个算法的核心思想就是求出最小函数依赖集Fm。书本上已经证明了"每一个函数依赖集F等价于极小的函数依赖集Fm",所以,采用Fm来代替原来的函数依赖F是可以行的,并且还满足保持函数依赖的定义。

转化为3NF既有无损连接性又有保持函数依赖的分解

教科书算法

在这里插入图片描述

我的归纳

①: 首先先分解为3NF并且具有保持函数依赖,设结果为Q={R1,R2…}
②: 然后找到关系R的关键字X,t=Q U {X}
③: 求t的最小集合,就是如果集合t中Ri<=Rj,则消去Ri

例题分析

在这里插入图片描述
在这里插入图片描述
注意一下在仅仅只要保持函数依赖性的时候,找的是N类属性,但是在既要保持函数依赖,又要保持无损连接的时候,就是还要寻找主码。大家也可以看到,其实这个算法就是在上面分解为3NF并保持函数依赖的基础上,加入了一个主码而已。为什么加入了主码就可以保证无损连接呢?其实大家在取判断无损连接的时候,大家可以去观察以下,一旦你得分解你里面包含主码,那么在它的那一行上面必然可以全部变成a,因为他是主码,自然可以推导出所有。所以,这里加入主码就可以保证无损连接了。

转化为BCNF的无损连接分解

教科书算法

在这里插入图片描述

我的归纳(我这里还没有理解清楚)

①: 首先检查该模式是不是BCNF,如果是的话,就不用分解了,因为BCNF一定满足无损分解
②: 如果不是的话,找一个函数依赖,X->Y ,并且X不是R的主码。那么将R分解为Q={S1,S2}
其中S1={XA},S2=U-{Y}.举个例子:F={A->C,C->D,B->C}。主码是AB,所以考虑A->C不满足条件,
将其分解为R1={AC},R2={ABD}={ABCD}-{C}
③: 后面的用一般普通语言不好描述,所以。还是使用一个例子来理解

例题分析

在这里插入图片描述
在这里插入图片描述
首先要说明的就是在分解为无损连接的BCNF的时候,这个时候的结果是不具有唯一性的。这个我问过我们老师,老师也说了,在你用不同的顺序选取非主属性的时候,此时会有不同的答案。所以说这个结果是不用怀疑的。还有就是关于如何分解后的F1,F2中的函数依赖关系是如何确定的,这个是需要弄清楚的。我拿上面图中左边的方法的F1,F2举例。因为S1={CT},在最开始题目所给的函数依赖中就只有一个可以使用,就是C—>T,但是对于S2={CHRSG},只要含有之前我们选中的C–>T中的T的,都不要。所以将函数依赖:C—>T和HT—>R不要,其他剩余部分组成F2的函数依赖。同样的道理,对于F4的函数依赖也是这样求出来的。因为选中的是HR–>C,所以在F2中有C的都不能要。

这个是使用到的ppt:https://wenku.baidu.com/view/d84ffdbf48649b6648d7c1c708a1284ac9500568.html?from=search

  • 34
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值