码迷,mamicode.com
首页 > 数据库 > 详细

数据库三个范式详解

时间:2016-12-25 17:34:41      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:并且   evel   net   数据   tail   sdn   依赖关系   blog   包含   

数据库三个范式详解

数据库范式的提出是为了对关系数据库中的数据进行规范而提出的一个概念,第一范式,第二范式,第三范式这三个范式逐渐对数据进行细分,意思就是指属于这三种范式之一的关系数据库的数据相互之间的依赖关系越来越清晰明了。下面对三种范式进行详细的讲解。

第一范式(1NF):属于第一范式的数据库的表的列(属性)是不能再进一步拆分的。如

 

学号 课程
2014212797 软件技术基础   高数

很显然,这个表格的第二列是可以在细分的,所以不属于第一范式。第一范式是数据库数据的最低要求,不满足第一范式的的“数据库”不能称为关系数据库,在非规范化数据去掉组合项。

学号 课程
2014212797 软件技术基础  
2014212798 高数

第一范式会出现数据冗余、插入、删除异常现象。(比如上面表格中学号的重复现象)

第二范式(2NF):首先得满足第一范式的条件,并且表中必须要有一个主键,同时不属于主键的属性(意思是主键可以是几个属性)必须完全依赖于主键(这句话有点绕,好好理解下),即设置好某个表的属性后可以根据这个主键检索得到唯一的一个属性,而不能得到几个结果。如果出现的部分依赖的属性则应当将该属性与主键的依赖部分单独分离出来,单独建立一个表。第二范式的任务就是在满足第一范式的条件下消除部分函数依赖。

学号   |  姓名 |  邮箱  |  课程号  | 课程地址

2323    lf       ddd      123         345

2323   lj       dsd       345        3789

显然这个表属于第一范式,主键(由学号与课程地址)能定位到唯一一行。但是课程地址部分依赖于课程号,与学号无联系,所以该数据库不属于第二范式。所以需要讲部分依赖的主键与属性单独建立一个表。原表变为两个表:

学号   |  姓名 |  邮箱  |  课程号 

2323    lf       ddd      123        

2323   lj       dsd       345       

  课程号  | 课程地址

  123         34

  345        3789

不符合第二范式的数据库容易产生数据冗余

第三范式(3NF):首先满足第二范式,同时不能存在传递性依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
StudyNo   |   Name   |   Sex   |      Email         |      bounsLevel   |   bouns

20040901      john         Male       kkkk@ee.net   优秀                    $1000

20040902     mary         famale    kkk@fff.net       良                         $600

这个完全满足了第二范式,但是bounsLevel和bouns存在传递依赖

更改为:

StudyNo   |   Name   |   Sex   |      Email         |      bouunsNo

20040901      john         Male       kkkk@ee.net   1

20040902     mary         famale    kkk@fff.net       2

bounsNo   |   bounsLevel   |   bouns

1                   优秀                $1000

 2                 良                   $600

表中bounsNo作为主键

一般符合第三范式的关系数据库能够避免数据冗余的情况。

本文参考了一下几篇博文:

http://blog.csdn.net/sunzhenhua0608/article/details/16850053

http://blog.csdn.net/famousdt/article/details/6921622

学生管理系统:http://www.cnblogs.com/nx520zj/archive/2013/05/29/3105725.html

数据库三个范式详解

标签:并且   evel   net   数据   tail   sdn   依赖关系   blog   包含   

原文地址:http://www.cnblogs.com/alsf/p/6219682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!