3NF和BCNF

 

           3NF范式

 

              依赖关系

                 R(U)  x与y都是u的子集,若对于R(U) 的任意可能关系  r,r中不存在两行记录在x 上的值相同,而在y值上不同,称:x->y,x依赖y

          

              x->y  x不包含于y  非平凡函数

 

              x--y  x包含于y    平凡函数

 

              x->y  y->x x<- ->y

 

              x->y  x任意一个子集x'  都有y不依赖于x'

 

 

        3NF范式

   就是如果关系r中的每一个 都是不可分  就是第一范式   属性不可分 1NF。注意:在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库

        2NF  所有的非主属性完全 依赖于任意候选键

 

        3NF范式  表中的每一个属性都不传递依赖于任何候选键

 

1NF转换成2NF

 

  采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

  将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。

  例:选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNO,CNO)

  在应用中使用以上关系模式有以下问题:

  a.数据冗余,假设同一门课由40个学生选修,学分就重复40次。

  b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。

  c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。

  d.删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。

  原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。

  解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系

 

 

 

 

BCNF

 

 

      BCNF是由Boyce和Codd提出的,比3NF又进了一步,通常认为是修正的第三范式.

   

    所谓第三范式,定义是关系模式R<U,F>中若不存在这样的码X,属性组Y及非主属性Z,使得X—>Y,Y—>Z成立,(不存在Y—>X),则称R<U,F>为3NF.

   即当2NF消除了非主属性对码的传递函数依赖,则称为3NF

 

 

   对3NF关系进行投影,将消除原关系中主属性对码的部分与传递依赖,得到一组BCNF关系。

 

   BCNF定义,关系模式中,若X函数确定Y且Y不在X内时X必含有码,则此关系属于BCNF。

 

 

   具有函数依赖集F的关系模式R属于BCNF的条件是,对所有F的闭包中形如   X->Y,

      下面至少有一个成立:

         1X->Y是平凡的依赖。

 

          2X是R的一个超码。

 

   一个满足BCNF的关系模式有:

 

   1 所有非主属性对每一个码都是完全函数依赖;

 

   2 所有的主属性对每一个不包含它的码,也是完全函数依赖;

 

   3 没有任何属性完全函数依赖于非码的任何一组属性。

 

    由于R∈BCNF,按定义排除了任何属性对码的传递依赖与部分依赖,所以R∈3NF。但是若R∈3NF,则R未必属于BCNF。

      例如:关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课。每门课有 若干个教师,某一学生选定某门课,就对应一个固定的教师。

        由语义可得到如下函数依赖:

     (S,J)->T;(S,T)->j;T->J。

     (S,J),(S,T)都是候选码。

      STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖。但STJ不是BCNF关系,因为T是决定因素而T不包含码。

 

 

 

          

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值