首页 > 代码库 > 数据库范式
数据库范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
一般说来,数据库只需满足第三范式(3NF)就行了。
符合高一级范式的设计,必定符合低一级范式。
一、第一范式
符合1NF的关系中的每个属性都不可再分。
1NF是所有关系型数据库的最基本要求。
举个例子,数据库中有一列是姓名,姓名不可再分,符合1NF。还有一列是联系方式,而联系方式可以分为手机,QQ,微信等,这就是可再分,所以不符合1NF。
二、函数依赖
所谓函数依赖,可以理解为若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。也就是说,在数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。这也就是“函数依赖”名字的由来,类似于函数关系 y = f(x),在x的值确定的情况下,y的值一定是确定的。
举个例子,每个学号对应一个名字,不存在学号相同而姓名不同的人,这就可以说姓名依赖于学号,写作学号→姓名。但是反过来,可能存在两个人的姓名相同,而学号不同的记录,所以不能说学号依赖姓名。
在函数依赖的基础上,可以分出三种函数依赖,分别是完全函数依赖和部分函数依赖和传递函数依赖。
完全函数依赖:在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ‘ → Y 不成立,那么我们称 Y 对于 X 完全函数依赖。
例:根据学号和课程可以得到一个分数,这个分数是唯一的,但是一个学号可能对应多个分数,一个课程也对应多个分数,那么这个分数就对于学号+课程完全函数依赖。
部分函数依赖:假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X。
例:学号+课程可以得到一个姓名,但是这个姓名不完全对应学号+课程,只需要对应学号+课程的一部分,学号就行了,这是姓名就是对于学号+课程部分函数依赖。
传递函数依赖:假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (严格来说还有一个X 不包含于Y,且 Y 不函数依赖于Z的前提条件),那么我们就称 Z 传递函数依赖于 X 。
例:通过学号可以确定学号所在学院,然后通过学院可以确定学院专业课程,那么专业课程对于学号就是传递函数依赖。
三、第二范式
2NF在1NF的基础之上,消除了非主键对于主键的部分函数依赖。
即不存在非主键只依赖主键的一部分。
四、第三范式
3NF在2NF的基础之上,消除了非主键对于主键的传递函数依赖。
即不存在非主键A依赖另一个非主键B,非主键B依赖主键。
数据库范式