一、概述
1.什么是范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
以上来自百度百科;所以,简单来说,范式就是规范要求
2.范式的要求
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
来自百度百科;所以,我们常用的是第三范式。他会自动要求满足低的范式。
二、第一范式
定义:
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
通俗的SQL语法来说,就是字段不可再分割!
简单来说,就是属性不可再分,也就是以下设计是错误的:
正确设计如下:
三、第二范式
定义:
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
属性完全依赖于主键!
// 以上概念解释参考自上文知乎回答
码:关系中的某个属性或者某几个属性的组合,用于区分每个元组(也就是每条记录);它是候选码的简称,也就是说,码一旦确定,其他属性也就随之确定了!
函数依赖:姓名函数依赖于学号,写作 学号 → 姓名;也就是学号一旦确定,姓名就确定了(但反过来不成立),所以这里是姓名函数依赖于学号!
其他概念不再一一赘述,参考上文知乎回答链接
所以,以下设计就是不符合第二范式的:
用通俗的语言来说,就是存在系主任不依赖与主键(学号,姓名),
至于所引发的更新异常、删除异常,参考链接处详细解释。这里列出一个删除异常:
假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)。
——删除异常
四、第三范式
定义:
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
属性不依赖于其他非主属性!
对于第二范式中的例子,由于存在学号->系名,系名->系主任,存在非主属性对于主属性的传递依赖
五、BC范式
定义:
在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)
关于示例,可以参考知乎回答链接