数据库范式研究

简述:

对数据库的范式了解不清楚,在这里弄明白它


一.   范式概念

当前范式的成立,必须满足之前的范式要求,比如第二范式必须先要满足第一范式


第一范式 1NF

数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。


第二范式 2NF

要求实体的属性完全依赖于主关键字。所谓完全依赖是指非关键字段都完全依赖于任意一组候选关键字


第三范式 3NF

非主属性不可传递依赖


BCNF范式

任何非主属性不能对主键子集依赖[在3NF基础上消除对主码子集的依赖]


二.  实例分析(取自百度百科):

1 . 第二范式的识别

下面介绍一张关系表,名为SelectCourse表, 其中各个属性如下

(学号,学生姓名、年龄、性别、课程、课程学分)

关键字为组合关键字(学号, 课程名称), 因为存在如下决定关系:

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

但是,我们发现这张表不单存在上述的依赖关系, 同时

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

2) (课程名称) →  (学分)

所以不符合第二范式,因为没有满足非关键字段都完全依赖于任意一组候选关键字

所以相比之后较好的数据库表的设计如下,

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

Course: (课程名称, 学分)

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


2 . 第三范式的识别

如下面这张学生表

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

我们直观的看到了下面这组依赖关系,

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

但是如果再仔细看一下,其实非主属性中还存在着一组关系,

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

我们发现在非主属性中出现函数依赖, 这个事有悖于第三范式(非主属性不可传递依赖),

所以修改之后更好的设计如下,

Student : (学号, 姓名, 年龄, 学院)

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


3.BC范式的识别

如下面这张表,列出了其中的几个字段

(身份证, 指纹信息,姓名,年龄)

我们发现有如下依赖关系,

1) (身份证)   →  (指纹信息,姓名,年龄)

2)(指纹信息)  →  (身份证,姓名,年龄)

存在关键字段决定关键字段的情况,也就是非主属性不能对主键子集依赖,所以其不符合BCNF范式

比较好的处理是,

FingerprintStore: (指纹信息, 身份证)

personalInfo: (身份证,姓名, 年龄)


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