简述:
对数据库的范式了解不清楚,在这里弄明白它
一. 范式概念
当前范式的成立,必须满足之前的范式要求,比如第二范式必须先要满足第一范式
第一范式 1NF
数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
第二范式 2NF
要求实体的属性完全依赖于主关键字。所谓完全依赖是指非关键字段都完全依赖于任意一组候选关键字
第三范式 3NF
非主属性不可传递依赖
BCNF范式
任何非主属性不能对主键子集依赖[在3NF基础上消除对主码子集的依赖]
二. 实例分析(取自百度百科):
1 . 第二范式的识别
下面介绍一张关系表,名为SelectCourse表, 其中各个属性如下
(学号,学生姓名、年龄、性别、课程、课程学分)
关键字为组合关键字(学号, 课程名称), 因为存在如下决定关系:
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
但是,我们发现这张表不单存在上述的依赖关系, 同时
1) (学号)→ (姓名, 年龄)
2) (课程名称) → (学分)
所以不符合第二范式,因为没有满足非关键字段都完全依赖于任意一组候选关键字
所以相比之后较好的数据库表的设计如下,
Student: (学号, 姓名, 年龄)
Course: (课程名称, 学分)
SelectCourse: (课程名称,学号,成绩)
2 . 第三范式的识别
如下面这张学生表
(学号,姓名,,年龄, 所在学院,学院地点, 学院电话)
我们直观的看到了下面这组依赖关系,
(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
但是如果再仔细看一下,其实非主属性中还存在着一组关系,
(所在学院) → (学院地点, 学院电话)
我们发现在非主属性中出现函数依赖, 这个事有悖于第三范式(非主属性不可传递依赖),
所以修改之后更好的设计如下,
Student : (学号, 姓名, 年龄, 学院)
College: (学院, 学院地点, 学院电话)
3.BC范式的识别
如下面这张表,列出了其中的几个字段
(身份证, 指纹信息,姓名,年龄)
我们发现有如下依赖关系,
1) (身份证) → (指纹信息,姓名,年龄)
2)(指纹信息) → (身份证,姓名,年龄)
存在关键字段决定关键字段的情况,也就是非主属性不能对主键子集依赖,所以其不符合BCNF范式
比较好的处理是,
FingerprintStore: (指纹信息, 身份证)
personalInfo: (身份证,姓名, 年龄)