1、范数的定义
在设计数据库时,为了使其冗余较小、结构合理,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则被称为范数。范数是符合某一设计规则的总结。
2、实际开发中的常见范式
(1)第一范式
定义:
数据库表中的所有字段值都是不可分割的原子值。
非第一范式举例:
原因:高三年1班含有年级和班级信息,可继续拆分,为非原子信息。
改:
(2)第二范式:
定义:
数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关。
例子:
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分)
(学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。
改:
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号, 姓名, 年龄);
课程:Course(课程名称, 学分);
选课关系:SelectCourse(学号, 课程名称, 成绩)。
就符合了第二范式。
(3)第三范式:
定义:
数据库表中的每一列和主键直接相关,而不是间接相关。也就是属性不能传递依赖于主属性。
例子:
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系
(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系
(学号) → (所在学院) → (学院地点, 学院电话)
改:
把学生关系表分为如下两个表
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。