数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)

    近期在学习数据库范式,这很是让博主纠结了一阵呢,所以简单总结一下,奉上一点案例分析,与您分享~

 

一、概念

 

     R-关系模式

     r-关系

     U-属性集

     FD-函数依赖

     X→Y:"X函数决定Y","Y函数依赖于X"。

     AB   A包含于B,A小,B大,B→A

 

     元组:二维表中的行

     属性:二维表中的列

 

     超键:能唯一标识元祖的属性集

     候选键:不含多余属性的超建

     主键:用户选作元组标识的候选键

     外键:对于当前模式而言,是另一模式下的主键。

     主属性:构成候选键的属性

 

     局部依赖与完全依赖:对于FD W→A,如果存在X包含于W,有X→A成立,那么称W→A是局部依赖,否则成W→A是完全依赖。

 

二、关系+例子

 

1NF

       每个关系r的属性值为不可分的原子值

 

       当赵同学有两个手机号时,他不能将两个手机号存储在一个属性框中,需要分开存放,如下表所示。

 

       错误:

             

       正确一:

             

       正确二:

            

 

2NF

  满足1NF,非主属性完全函数依赖于候选键(左部不可约)

 

  若一张表的数据包括:“学号、姓名、课程号、授课老师”中,设“学号、课程号”为主键,其中,一门课程可以有多个老师进行授课。会存在如下关系:

            

 

                  (学号、课程号)→姓名

                  学号→姓名

                                 ---------为局部依赖,即候选键的一部分可以推出非主属性系名

 

         可分解为两个表,达到完全依赖:“学号、姓名”与“学号、课程号、授课老师”

                            

 

 

3NF

  满足2NF,消除非主属性对候选键的传递依赖

 

  若一张表的数据包括:“学号、系名、系主任”,其中“学号”为主键,存在如下关系:

          

 

                学号→系名→系主任

                学号→系主任

                            ---------为传递依赖

 

        同样可分解为两张表:“学号、系名”和“系名、系主任”

                       

 

     对于第三范式,我们反过来理解也是可以的,在表1(学号、系名),表2(系名、系主任)中,学号和系名都是各自表中的主键,所以系名依赖于学号,系主任依赖于系名。当三个数据放置在一张表中时,学号是可以推出系主任的。你可以理解为通过看学生张小二的学号,是可以推理出他的系主任是谁的。

 

 

BCNF

   满足3NF,消除每一属性对候选键的传递依赖

 

   若一张表的数据包括:“书号、书名、作者”其中,书号是唯一的,书名允许相同,一个书号对应一本书。一本书的作者可以多个,但是同一个作者所参与编著的书名应该是不同,希望没有说晕,看图看图。

                   

 

      存在关系:

                  书号→书名

                  (书名、作者)→书号

      其中,每一个属性都为主属性,但是上述关系存在传递依赖,不能是BCNF。即:

                  (书名、作者)→书号→书名

                   (书名、作者)→书名   

      我们可以通过分解为两张表,实现BCNF。

                            

 

4NF

   满足BCNF,消除非平凡且非FD的多值依赖(MVD)

 

   非形式说:只要两个独立的1:N联系出现在一个关系中,那么就可能出现多只依赖。举例说明。

 

   一个表中存在三个数据:“课程、学生、先修课”。假设2017级的计算机专业学生想要学习JAVA课程,那么他们需要先学习VB、C#、BS三门课,才可以选择进行JAVA课程。存在关系:

 

 

 

课程→学生

课程→先修课

 

    两个均是1:N的关系,当出现在一张表的时候,会出现大量的冗余。所以就我们需要分解它,减少冗余。(Ps:该例子主要是为了说明概念帮助理解,具体应用中不会只是这样的简单粗暴的。)

                               

 

  说明:关于上面的例子,主要是为了帮助理解范式,如有错误,敬请各位读者指出。感谢您的阅读。

  • 96
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
中国海洋大学实验报告 年 月 日 姓名 系年级 2012级 专业 计算机学号 科目 数据库 题目 通过实验体会关系数据理论,函数依赖以及范式。 实验要求 1. 设计一个关系,使之满足2NF而不满足3NF; 设计一个关系,使之满足3NF而不满足BCNF; 2. 详细描述关系的语义,分析关系中存在的函数依赖; 3. 使用商用数据库SQL Server设计实现,录入数据; 4. 体会数据冗余、增加异常、删除异常、修改复杂。 实验环境 Windows7系统下 Microsoft SQL Server 实验步骤 1. 首先要弄清楚2NF3NFBCNF的定义与区别,再开始设计; 2. 满足2NF而不满足3NF,则代表了这个关系消除了非主属性对码的部分依赖,但没有 消除非主属性对码的传递函数依赖,那么就可以开始设计了:设这个关系为R1, 设u={Sno,Sclass,Cmon},Sno代表学生的学号,Sclass代表班号,Cmon代表 班主任的工号,且存在这样的函数依赖:Sno->Sclass,Sclass->Cmon,Sno- >Cmon;Sno为主码,Sno为主属性,Sclass、Cmon为非主属性。容易知道,Sclas s与Cmon的真子集都无法函数确定Sno,所以非主属性Sclass、Cmon对Sno完全函数 依赖,所以满足2NF;而由于Sno- >Sclass(Sclass不是Sno的子集,也不能函数确定Sno),Sclass- >Cmon,所以非主属性Cmon对码Sno传递函数依赖,所以它不是3NF。因此,R1满足 2NF而不满足3NF。 3. 满足3NF而不满足BCNF,代表了这个关系消除了非主属性对码的部分依赖、传递依赖 ,但并不是每一个决定因素都包含码,那门就可以从这里入手了:设这个关系为 R2,要满足要求,则需找到一个或一组属性,让它既不是码,又能够函数决定另 外一个或一组属性,为了简单方便,这里只找一个而不是一组;设u={Sno,Tno ,Cno},Sno代表学生的学号,Tno代表教师的工号,Cno代表课程号,一个老师 只教授一门课,但一门课可以由多个教师来上,一个学生选定一门课,那么就对 应一个固定的老师。即(Sno,Cno)->Tno,Tno->Cno,且由Tno- >Cno可以推出(Sno,Tno)- >Cno,再根据候选码的定义可以知道,(Sno,Cno)与(Sno,Tno)都是候选码, 而Tno不是,但Tno是决定因素,所以R2不是BCND;又可以容易看出R2中不存在非 主属性对码的部分依赖与传递依赖,所以R2满足3NF。因此,R2是3NF而不是BCNF 。 4. R1的实现: 输入数据 5. R2的实现: 输入数据: 6. 数据冗余:如图所示:R1中 R2中 7. 增加异常:R1中不存在,因为学生一入学就会有一个独一无二的学号,R2中存在, 一个学生想选一门新加入的课,可能这门课还没有分配老师,只是请了一些人暂 时代课,那么这条记录就无法添加了。 8. 删除异常:R1中不存在,R2中也不存在; 9. 修改复杂:R1中,如果有两个同学是同一个班级的,那么如果这个班级换了班主任 ,修改数据时,在修改了一个条目之后,会导致数据库内容不一致,需要将另外 一个条目也修改才可以;R2中,如果一个老师换了教授的课程,那么在数据库中 可能有很多条选了这个老师的学生的所在条目要作出修改。 实验心得 1. 设计一个好的数据库,需要多次反复地思考、实践,并不能一蹴而就,需要考虑到很多 方面的内容; 2. 在测试时还要想到方方面面不同情况的例子,来检验各种异常,否则容易有局限性; 3. BCNF是一个比较难以掌握的范式,必须要多看定义、多加理解、多看例子进行分析,才 能够进一步理解范式。 ----------------------- 数据库范式设计实验报告全文共3页,当前为第1页。 数据库范式设计实验报告全文共3页,当前为第2页。 数据库范式设计实验报告全文共3页,当前为第3页。
数据库设计中的范式主要是为了规范化数据,减少数据冗余和数据异常,提高数据的一致性和完整性。常见的范式1NF2NF3NFBCNF4NF等。 1NF(第一范式):数据表中的列都是不可分割的原子数据项。即每个列都只能有一个值,不可再拆分。 例如,一个订单表中的订单编号、客户编号、订单日期、订单金额、商品编号、商品名称、商品数量等列都应该是不可分割的原子数据项。 2NF(第二范式):在1NF的基础上,非主键列对主键列具有完全依赖关系。即非主键列只与主键有关系,而不与其他非主键列有关系。 例如,一个订单详情表中的订单编号、商品编号、商品名称、商品单价、商品数量等列都应该与订单编号有关系,而不与商品名称列有关系,因为商品名称只与商品编号有关系。 3NF(第三范式):在2NF的基础上,消除非主键列之间的传递依赖关系。即非主键列之间不应该存在依赖关系,而是应该通过主键来关联。 例如,一个学生选课表中的学生编号、课程编号、课程名称、教师名称、教室名称等列都应该与学生编号和课程编号有关系,而不应该存在教师名称和教室名称之间的依赖关系。 BCNF(巴斯-科德范式):在3NF的基础上,消除主键列之间的依赖关系。即主键列之间不能存在依赖关系,否则应该拆分成多个表。 例如,一个学生选课表中的学生编号、课程编号、成绩等列都应该与学生编号和课程编号有关系,而不应该存在学生编号和成绩之间的依赖关系。 4NF(第四范式):在BCNF的基础上,消除多值依赖关系。即一个表中的某些列的值可能对应多个值,应该将其拆分成多个表。 例如,一个学生选课表中的学生编号、课程编号、成绩、评价等列都应该与学生编号和课程编号有关系,而不应该存在成绩和评价之间的多值依赖关系。应该将成绩和评价分别拆分成两个表,与学生编号和课程编号关联。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值