首页 > 数据库技术 > 详细

数据库-关系型数据库-范式

时间:2021-05-04 23:22:53      阅读:22      评论:0      收藏:0      [点我收藏+]

1. 范式概述

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式 (BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
满足最低要求的范式是第一范式(1NF)。在 第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
一般说来,数据库只需满足第三范式(3NF)就行了。

2. 范式类型

  • 1NF : 符合1NF的关系中的每个属性都不可再分
  • 2NF: 属性完全依赖于主键 [消除部分子函数依赖]
  • 3NF: 属性不依赖于其它非主属性[消除传递依赖]***
  • BCNF: 在1NF基础上,任何非主属性不能对主键子集依赖[在3NF基础上消除对主码子集的依赖]
  • 4NF: 要求把同一表内的多对多关系删除。
  • 5NF: 从最终结构重新建立原始结构。

3. 范式详解

1NF详解

表中的每一列都具有原子性,不可再分割,即实体中某个属性不能有多个值,或者不能有重复的属性。

2NF详解( 属性完全依赖于主键 )

表中每一个实例或行,必须可以被唯一的区分。为实现唯一区分通常为表添加一列,用来存储每一行的唯一标识。这个唯一属性列也被称为主键、主码。
【属性完全依赖于主关键字】,其中完全依赖是指:不能存在仅依赖主属性一部分的属性。
 
例如(学号,姓名,年龄,课程名称,成绩,学分),主属性为(学号,课程名称),有如下决定关系:(学号,课程名称) -> (姓名,年龄,成绩,学分)。
然而(课程名称) -> (学分),(学号) -> (姓名,年龄)。即存在属性仅依赖主属性一部分的属性,不符合2NF。
会有如下问题:
(1)数据冗余
 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2)更新异常
若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3)插入异常
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4)删除异常
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
 
针对以上问题,如果存在属性仅依赖于主属性一部分属性,那么这个属性和主属性的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
例如,上例变为以下三张表: (学号,姓名,年龄)(课程名称,学分)(学号,课程名称,成绩)。

3NF详解( 属性不依赖于其他非主键 )

3NF要求一个数据表中不包含已在其他表中已包含的非主关键字。

例如:

存在一个部门表(dept_id, dept_name, dept_desc),又有一个员工表,那么在员工表中添加了dept_Id后,不能再将dept_name, dept_desc添加到员工表中,否则容易造成大量数据冗余。

因此符合3NF的数据库表应该不存在如下依赖关系:关键字段 -> 非关键字段X -> 非关键字段Y

例如:

假设学生表Student(学号,姓名,年龄,所在学院,学院地址,学院电话),关键字为“学号”,存在以下决定关系:(学号)-> (姓名,年龄,所在学院,学院地址,学院电话)

这个关系符合2NF,但不符合3NF,因为有如下决定关系:(学号)-> (所在学院) -> (学院地址,学院电话)。即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

数据库-关系型数据库-范式

原文:https://www.cnblogs.com/th2009yu/p/14730388.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!