按照教材中的定义,范式(NF)是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。对于数据库而言就是一张数据表的表结构所符合的某种设计标准的级别。
关键词定义:
码:关系中的某个属性或者某几个属性的组合,用于区分每个元组(可以把“元组”理解为一张表中的每条记录,也就是每一行)也就是主键。
非主属性、主属性:在码中的叫主属性,在码外的叫非主属性
函数依赖:在一张表中存在字段X,在X的值确定的情况下,必定能确定Y的值就叫做Y函数依赖于X
完全函数依赖:存在字段组X,字段Y依赖于字段X,并且Y不依赖于X的任何一个真子集,则Y完全函数依赖X
部分函数依赖:存在字段组X,字段Y不完全依赖于X,而是依赖于X中的某一个或者某一些字段就是Y部分函数依赖X
传递函数依赖:假如 Z 函数依赖于 Y,且 Y 函数依赖于 X ,且Y不包含于X,Z传递函数依赖于Y
在数据库中范式分别是:
1NF:符合1NF的关系中的每个属性都不可再分。
2NF:2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
3NF:3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
BCNF:消除了主属性对于码的部分与传递函数依赖。
4NF:消除了一个表中的多对多关系
5NF:在满足前五个范式的情况下,消除连接依赖,并且必须保证数据完整性。
对于1NF而言,所有的数据元素都是不可分割的数据单元,也就是说每个字段都无法再细分现在有这样一张学生信息表,表中只有两个字段,id(学号)、message(学生信息)。
可以看出学生信息字段存着所有的学生信息,若要对学生信息进行修改就要修改整个message字段,而且在对学生信息进行查询的时候也会因为大量的模糊查询影响效率。对于message字段来说完全可以分割为 name phone address age等字段,对于上表而言字段message不是不可分割的数据元素,不满足1NF
在满足1NF的基础上,消除非主属性(不是主键的字段)对主属性的部分函数依赖(这个通常指的是用于多个字段的主键组,非主键字段只依赖于主键组中的个别字段而不依赖于整个主键组)
有表如下
id 和 class为主键,该表的问题如下
name 和 college字段重复率太高造成可能会造成大量的冗余,
若学校想要新创建一个学院,但是该学院暂时没有学生,根据表的结构来看是无法插入数据的,没有学生也就没有对应的课程,class字段还是该表的主键之一,主键为空根本无法插入数据。
假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)。
假如有学生想要转系,那么为了保证数据库中数据的一致性,需要修改所有记录中关于该学生的系与系主任的数据,甚至个别课程以及分数的数据,代价太高。
要满足2NF就要消除姓名,学院,系主任与 主键的部分函数依赖以及各科成绩和主键的部分函数依赖,即学号 课程 分数建立一个表 学号和课程 充当主键,学号 姓名 学院 系主任建立一张表学号为主键,两张表之间有学号做一对多联系。
分表完毕之后可以看出整体已经满足2NF,但是在学号 姓名 学院 系主任表中还存在着问题,学院依赖于学号,系主任依赖于学院,系主任和学号之间就存在这传递函数依赖,也就不满足3NF。从表上来看,如果数据量多起来,就会造成大量的系主任字段数据冗余,而且在修改和增加操作中也会出现异常(多出来的对系主任字段的操作),为了解决这个问题就必须将此表再次分隔。学号 姓名 学院为一张表,学号为主键,学院 系主任为一张表学院为主键
BCNF就是为了解决主属性对于主属性的传递依赖,相当于3NF的加强
对于4NF和5NF贫道法力尚浅,望见谅。