范式
范式(数据库设计范式,Normal Form,NF)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则 。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
规范化
一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(Normalization)。
规范化的目的是使关系结构简单清晰,消除关系模式中的冗余和异常(数据冗余、插入异常、更新异常、删除异常)。遵循单一化的“一事一地”原则,即一个关系模式描述一个实体或实体间的关系。根本目标是节省存储空间,避免数据的不一致性,提高对关系操作效率,同时满足应用的需求。但是在实际的开发应用中并不一定要追求更高的范式,而是应该根据具体的需求综合考虑硬件和效率,以满足要求为根本。
目前关系数据库存在八种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)、第五范式(5NF)、域键范式(DKNF)、第六范式(6NF),但是一般情况下只需满足前三个范式即可。
01 第一范式
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,第一范式就是无重复的列。
示例1:
示例2:
示例1中,李四那一列可以拆分为两行,分别对应语文、数学两个课程。而示例2中家庭信息那一列也可以拆分为人数、籍贯两列。
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
02 第二范式
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
示例:
示例中第一张图是一张选课表,主关键字为(学生,课程),非主属性有任课教师、成绩。在该表中,非主属性任课教师依赖于主关键字(学生,课程),但同时还存在着非主属性任课教师依赖于主关键字的一部分——课程,也就是说非主属性任课教师部分函数依赖于主关键字(学生、课程)。在这种情况下,要符合第二范式,需要消除部分函数依赖,即把选课表进行拆分,把有部分函数依赖的非主属性和主关键字的那一部分取出形成另一张表,而原来的选课表需删除存在部分函数依赖的非主属性,结果如示例中第二张图。
03 第三范式
第三范式(3NF)必须先满足第二范式(2NF),还需要满足表中所有属性唯一性地被主关键字决定,且不存在非主属性传递依赖于主关键字。
示例:
示例中第一张图是一张课程表,在该表中,课程是主关键字。主关键字决定着任课教师的人选,任课老师不能决定课程,但是任课老师可以决定宿舍,也就是说宿舍传递函数依赖于课程。为满足第三范式,需对课程表进行拆分,提取出任课老师和宿舍信息组成一张新表,结果如示例中第二张图。它符合第三范式,消除了传递函数依赖。