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