数据库三范式

preface:温故而知新。网上资料加上个人理解。记录于此。

 

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解。(只要是关系型数据库都满足1NF)。如学生信息表,不能将学生信息都放在一列中显示,也不能将其中的两列或多列在一列中显示。简而言之,第一范式就是无重复的列。

学生信息表:

学号   姓名 年龄 家庭地址
001 小文 22 温州市DD县DD镇
002 小红 21 温州市AA县AA镇

 

 

 

 

PS:网上有人说,类似地址字段,是可以再分解的,否则不满足1NF。也有人说,认为可以再分解的观点是有偏差的。不管如何,个人觉得,根据实际情况出发,比如,如果频繁用到学生家庭地址里的市县等信息,可以分解成多个字段存储。反之,则无需分解。

第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识,即实现唯一性。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式。

第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如学生信息表中加上了学号列,因为每个学生的学号是惟一的,因此每个学生可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
      第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

PS:个人理解认为,这里的“要求实体的属性完全依赖于主关键字”。可以用组合主键(复合主键)来说明一下。就是说两个字段(A,B)组成的复合主键,其他字段信息不应该存在通过A或B(也就是依赖主关键字(复合主键)的一部分)就能确定其字段信息。通常的做法是咱们不用组合主键,添加一个ID,做为单一主键即可满足第二范式。如果不想添加ID,请满足组合主键(AB)里面的A或者B 与其他字段不能存在部分依赖。

 

学生信息表(1):(可能设计不合理,只是为了说明2NF)

学号   课程号   成绩 姓名 年龄 家庭地址
001  1111  90 小文 22 温州市DD县DD镇
002  22222  98 小红 21 温州市AA县AA镇
002  22222  98 小李 21 温州市AA县AA镇

 

 

 

 

 

表(1)就不符合第二范式,个人理解如下:

1,记录重复了,需要设置学号为主键,确定唯一性。

2,如果不适用学号为主键,而使用复合主键,并且如果我想要得到“某个学生的某个课程的成绩”,就需要联合字段学号和课程号为一个复合主键(个人认为的复合主键)。而其他字段信息如姓名等,就是仅仅依赖于复合主键(学号,课程号)里的学号,用不到课程号。故最好的办法,就是将这个表分解成两个表,一个是学生信息表,一个是课程信息表。

第三范式:3NF是对字段冗余性的约束。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,例如,在专业系信息表中,有系ID,系名称,系简介等,那么在学生信息表中,就不能再将系名称,系简介等再加入学生信息表中。

学生信息表:

学号   姓名 年龄 家庭地址  系名
001 小文 22 温州市DD县DD镇  英语
002 小红 21 温州市AA县AA镇  数学

 

 

 

专业系信息表:

 

 

系ID 系名 系简介
0001 英语 FADASDFA
0002 数学 24232423

 

 

这两个表中的系名就出现了冗余。可以改用系ID(外键)关联。

 

 

 

 

 

posted @ 2012-11-07 08:56  蚊子吃青蛙  阅读(1424)  评论(0编辑  收藏  举报