数据库面试题——范式

1、范数的定义

在设计数据库时,为了使其冗余较小、结构合理,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则被称为范数。范数是符合某一设计规则的总结。

2、实际开发中的常见范式

(1)第一范式

定义:

数据库表中的所有字段值都是不可分割的原子值。

非第一范式举例:


原因:高三年1班含有年级和班级信息,可继续拆分,为非原子信息。

改:


(2)第二范式:

定义:

数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关

例子:

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

这个数据库表不满足第二范式,因为存在如下决定关系:

(课程名称) → (学分) 

(学号) → (姓名, 年龄)

即存在组合关键字中的字段决定非关键字的情况。 

改:

把选课关系表SelectCourse改为如下三个表: 

学生:Student(学号, 姓名, 年龄);

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

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

就符合了第二范式。

(3)第三范式:

定义:

数据库表中的每一列和主键直接相关,而不是间接相关。也就是属性不能传递依赖于主属性。

例子:

假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系

(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系

(学号) → (所在学院) → (学院地点, 学院电话)

改:

把学生关系表分为如下两个表

学生:(学号, 姓名, 年龄, 所在学院);

学院:(学院, 地点, 电话)。


猜你喜欢

转载自blog.csdn.net/weixin_41886551/article/details/80540636