范式(数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循必定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须知足必定的要求,即知足不一样的范式。数据库
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不知足第一范式(1NF)的数据库就不是关系数据库。数据库设计
所谓第一范式(1NF)是指数据库[表]的每一列都是不可分割的基本数据项,同一列中不能有多个值,即[实体]中的某个属性不能有多个值或者不能有重复的属性。设计
例如一个字段NAME
保存了“李白,字太白”,这样就不符合第一范式,由于存储了多个值,可改成名
和字
两个字段,分别保存李白和太白。code
在知足第一范式的基础上,不容许部分依赖。效率
所谓部分依赖,指的是当主键由两个以上的字段组成的时候。其余非主属性不能仅仅依赖主键的一部分。好比学号
,课程
,分数
,姓名
这四个字段。咱们把(学号
,课程
)组合起来做为主键,能够发现,分数
是依赖于所有主键的,而姓名
仅仅依赖于学号
,和课程
没有半毛钱关系,这就叫部分依赖。基础
不知足第二范式会存在一些问题:引用
数据冗余:每条记录都含有相同信息;数据
删除异常:删除全部学生成绩,就把课程信息全删除了;查询
插入异常:学生未选课,没法记录进数据库;异常
更新异常:调整课程学分,全部行都调整。
若是按照第二范式设计,能够拆分红
学生表:student(学号, 姓名);
课程表:course(课程号, 学分);
选课关系表:student_course(学号, 课程号, 成绩)。
在知足第二范式的基础上,不能存在依赖传递。
好比一张表有学号
,姓名
,课程号
,课程名称
,这几个字段。课程号
依赖于学号
,而课程名称
依赖于课程号
。因此课程名称
传递依赖于学号
。
可能会存在问题:
若是按照第三范式进行设计,能够拆分红
学生表:student(学号, 姓名, 课程号);
课程表:course(课程号, 课程名称)。
在进行数据库设计时,不能古板的一味迎合范式。不难看出,范式的等级越高,拆分的表就越多,查询操做也就越复杂,查询的效率也会受到影响。因此在有些时候适当下降范式标准,增长一些冗余字段,虽然会增长一些空间占用,以及对冗余数据的维护工做,但带来的效率的提高是很值得的,这就是所谓的反三范式。