数据库范式

一、范式简介

数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率和优雅的数据库。甚至设计出错误的数据库。

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

所为第一范式(1NF)是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个或者不鞥有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体和原实体之间为一对多关系。在第一范式(1NF)中中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

1.2、第二范式(2NF) 属性完全依赖于主键(消除部门子函数依赖)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或者行必须被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识符,例如员工信息表中加上员工编号(employee_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主键或者住关键字。

第二范式(2NF)要求实体的属性完全依赖于主键,所为完全依赖是指不能存在紧依赖主键的一部分的属性,如果存在,那么这个属性和主键的这一部分应该分离出来形成一个新的实体,新实体和元实体之间是一对多的关系。为实现区分通常要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二方式就是属性完全依赖于主键。

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

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NS)要求一个数据库表中不包含其已经在其他表中包含的非主键信息。例如,一个部门信息表,其中每个部门都有编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门标号后就不能再将部门名称、部门简介与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建他,否则就会有大量的数据冗余。简而言之,第三方是就是属性不依赖其他分主键。

二、范式应用实例解剖

下面以一个学校的学生系统为例分析说明,这几个范式的应用。

2.1、首先是第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整形、实数、字符型、逻辑性和日期型等。我们先确定一下要设计的内容包括哪些:学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩、系办地址、联系电话等信息,如下表所示,

我们对于这些信息,所关心的问题有如下几个方面,

(1)学生有哪些基本信息;

(2)学生选了哪些课程,成绩是什么;

(3)每个课的学分是多少;

(4)学生属于哪个系,系的基本信息是什么。

上面就是按照第一范式(1NS)来设计的数据库表。

2.2、第二范式(2NF)实例分析

首先我们考虑,把所有这些信息放到一个表中(学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩、系办地址、系办电话),这些属性存在如下的依赖关系,

(学号)->(姓名、年龄、性别、系别、系办地址、系办电话)

(课程名称)->(学分)

(学号,课程)->学科成绩

如果按照第一范式(1NF)的数据库设计,会有很多的问题,这时候按照第二范式(2NF)来优化数据库设计,将第一范式(1NF)设计的表分为如下几个表,

学生:Student(学号,姓名,年龄,性别,系别,系办地址,系办电话)

课程:Course(课程名称,学分)

选课关系:SelectCourse(学号,课程名称,成绩)

分别对应如下三张数据库表,

Student:

Course:

SelectCourse:

2.3、第三范式(3NF)实例分析

接着看上面的学生表Student(学号、姓名、年龄、性别、系别、系办地址、系办电话),主键为单一关键字“学号”,因为存在如下决定关系,

(学号)->(姓名,年龄,性别,系别,系办地址,系办电话)

但是还存在下面的决定关系,

(学号)->(所在系别)->(系办地址,系办电话)

即存在非主键字段“系办地址”和“系办电话”对主键“学号”的传递函数依赖。他也会存在数据容易、更新异常和插入、删除异常的情况。所以,根据第三范式把学生关系表分为如下两个表就可以满足第三范式了,

学生:Student(学号、姓名、年龄、性别、系别);

系别:(系别ID、系办地址、系办电话)。

所以,按照第三范式设计的数据库表包含如下四张表,

Student:


Department(系别):


Course:

SelectCourse:

总结:上面,就是将数据库从第一范式向第三范式抽象,优化数据库的一些设计方法和逻辑思想。有不正确的地方还请各位指正!

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