数据库范式


参考博客:http://www.cnblogs.com/xwdreamer/archive/2012/05/17/2506039.html


数据库范式是关系数据库理论的基础,也是我们设计数据库结构过程中所遵循的规则和指导方法;常用的范式有三种:第一范式,第二范式,第三范式;

第一范式(1NF):无重复的列

    数据库表中的每一列都是不可分割的基本数据项,同一列中不能同时有多个值;第一范式是对关系型数据库的基本要求,不满足第一范式的数据库就不是关系型数据库,我们用DBMS构建的数据库都满足第一范式;

第二范式(2NF):属性完全依赖于主键

    满足第二范式,首先要满足第一范式;第二范式要求每个实例或者行能被唯一的区分,为实现区分通常给表加上一列,存储各个实例的唯一标识,这个标识列被称为主键或主关键字;

    第二范式要求各个属性列必须完全依赖于主键,完全依赖指的是不能只依赖于主键的一部分属性,有的数据表只有一个主键,天然的满足第二范式,对于有些情况,存在联合主键时,就需要判断非主键属性是否完全依赖于主键; 

    例如这样一张数据表:

数据库范式_第1张图片

    表中主键有两个属性,stuNo和courseNo,而属性stuName,age,sex仅仅依赖于stuNo,而courseName和credit只依赖于courseNo,所以不满足第二范式,需要对表进行拆分:

数据库范式_第2张图片


第三范式(3NF):属性不依赖于其他非主属性(消除传递依赖)

    满足第三范式首先需要满足第二范式,同时,非主属性必须仅仅依赖于主属性,不能依赖于其他非主属性;

    例如这样一张数据表:

数据库范式_第3张图片

    表中属性dept_name和dept_info依赖于dept_id,而不是主键emp_id,所以不满足第三范式;

数据库范式_第4张图片

    拆分之后满足第三范式,但是查询时需要数据库连接来实现:

select e.emp_id,e.emp_name,d.dept_name from Employee e,Dept d where e.dept_id=d.dept_id


1. 数据库连接会带来一定程度的性能损失;

2. 数据库范式并不是越高越好(范式越高,冗余程度越小);

3. 有时会在数据库范式与数据冗余之间做出权衡,在实际开发中,会允许一部分冗余来减少数据库的连接;

你可能感兴趣的:(数据库)