在数据库中如何消除部分依赖举例

在数据库中如何消除部分依赖举例,第1张

把它单独成表。

部分依赖:码是属性组,但其中部分属性就可以决定一些非码属性。2NF就是消除部分依赖:把这些非码属性和能够决定他们的码中的那些个属性拿出去单独成表。

如果是传递依赖:非码属性中存在依赖(这样这个表就起码两层依赖了)。3NF就是消除传递依赖:把非码属性中(A依赖B)这两个属性拿出去单独成表,主表中A去掉。

你好!

首先我们可以看到,C→D在R2上保持函数依赖,但是A→D,B→D在R1,R2上都不保持,所以做进一步判断——

判断的算法如下:

对F上的每一个α→β使用下面的过程:

①令result=α

②t=(result∩Ri)+ ∩Ri;

result=result∪t

(第二步的Ri={R1(...),R2(...),...,Rn(...)},该步骤遍历一遍分解出的关系模式)

要注意的是这里的属性闭包是在函数依赖集F下计算出来的,如果result中包含了β的所有属性,则函数依赖α→β,分解是保持依赖的(当且仅当上述过程中F的所有依赖都被保持)。

那么我们来判断一下,首先是A→D

先对R1,令result=A,result∩R1=A,A+=AD,t=A+∩R1=A,result=A;

再对R2,令result=A,result∩R2=空集,空集无法求闭包,那么t=空集,result=A。

可以发现无论对于R1还是R2最后的result都是A,并未包含D,所以A→D未被保持,这里已经可以得出该分解不保持函数依赖

对于B→D也是一样的方法:

先对R1,令result=B,result∩R1=B,B+=BD,t=B+∩R1=B,result=B;

再对R2,令result=B,result∩R2=空集,空集无闭包,t=空集,result=B;

result并未包含D,所以B→D也同样未被保持,该分解不保持函数依赖

关系模式分解准则

关系模式的规范化过程是通过对关系模式的分解来实现的。把低一级的关系模式分解为若干个高一级的关系模式。这种分解不是唯一的。

规范化的方式是进行模式分解,模式分解的原则是与原模式等价,模式分解的标准是:

模式分解具有无损连接性

模式分解能够保持函数依赖

举例:关系规范化过程

第一范式(1NF):如果一关系模式,它的每一个分量是不可分的数据项,即其域为简单域,则此关系模式为第一范式。

例:将学生简历及选课等数据设计成一个关系模式STUDENT, 其表示为:

  STUDENT(SNO,SNAME,AGE,SEX,CLASS,DEPTNO,DEPTNAME,CNO,

CNAME,SCORE,CREDIT)

设该关系模式满足下列函数依赖:

F={SNO-->SNAME, SNO-->AGE, SNO-->SEX, SNO-->CLASS,CLASS-->DEPTNO,          DEPTNO-->DEPTNAME, CNO-->CNAME,SNO.CNO-->SCORE, CNO-->CREDIT}

由于该关系模式的每一属性对应的域为简单域,即其域值不可再分,符合第一范式定义,所以STUDENT关系模式为第一范式。

第二范式(2NF):若关系模式R?1NF,且每个非主属性完全函数依赖于码,则称R?2NF。

分析一下关系模式STUDENT, 它是不是2NF ?

属性组(SNO,CNO)为关系STUDENT的码。

例如:SNAME非主属性,根据码的特性具有:SNO.CNO??SNAME

根据STUDENT关系模式已知函数依赖集,下列函数依赖成立:SNO??SNAME

所以SNO.CNO??SNAME, SNAME对码是部分函数依赖。同样方法可得到除SCORE属性外,其它非主属性对码也都是部分函数依赖。所以STUDENT关系模式不是2NF。

当关系模式R是1NF而不是2NF的模式时,对应的关系有何问题呢?我们分析STUDENT关系模式,会有下列问题:

存在大量的冗余数据:当一个学生在学习多门课程后,他的人事信息重复出现多次。

根据关系模型完整性规则,主码属性值不能取空值。那么新生刚入学,还未选修课程时,该元组就不能插入该关系中。这种情况称为插入异常。

同样还有删除异常,则会丢失信息

解决上述问题方法是将大的模式分解成多个小的模式,分解后的模式可满足更高级的范式的要求。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6621155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-25
下一篇 2023-03-25

发表评论

登录后才能评论

评论列表(0条)

保存