1、范式简介
- 在关系型数据库中,关于设计表设计的基本原则、规则被称为范式(Normal Form,简称NF)。
- 目前关系型数据库有6种范式,等级从低到高分别为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,也称完美范式)。
- 数据库的范式设计越高,冗余度就越低,同时高阶范式一定符合低阶范式,一般来说,关系型数据库设计中,最高也就满足到BCNF,普遍为3NF。
2、键和相关属性的概念
范式定义会涉及到主键和候选键,数据库中的键由一个或多个属性组成。
- 超键:能够唯一标识元组的属性集;
- 候选键:如果超键不包括多余的属性,那么这个超键就是候选键;
- 主键:用户可以从候选键中选择一个作为主键;
- 外键:例如属性x不是表a的主键但是表b的主键,那么属性x就为表a的外键;
- 主属性:包含任一候选集中的属性成为主属性;
- 非主属性:不包含任一个候选键中的属性;
表a:name,number,sfz(身份证号),sex,age
表b:number,subject,score,class
超键:对于表a来说,包含number或sfz的任意组合
候选键:最小的超键,仅包含number或sfz
主键:number或sfz 选其一
外键:表b中的number
主属性:number或sfz
非主属性:number和sfz之外的属性
3、第一范式:原子性
- 保证数据表中的每个字段的值必须有原子性。即每个值不可再分的最小数据元。
- 例1:小白有两个手机号写在同一个字段值中,不符合原子性,需将其拆分为两行或者拆分为连个新字段显示即可满足1NF。
name | phone |
---|---|
小白 | 12345678902 76543218908 |
name | phone |
---|---|
小白 | 12345678902 |
小白 | 76543218908 |
- 例2:某同学的地址为xx市xx区xx镇,其中包含了三段:市区镇,明显可以进一步拆分为三个字段。
4、第二范式:唯一性
-
满足1NF基础上,满足数据表里的每一条数据记录都是唯一标识的。而且所有非主键字段完全依赖主键,不能只依赖主键的一部分。
-
例1:成绩表(学号,课程,成绩),(学号,课程)可以决定成绩,但学号或者课程都不能决定成绩,所以”(学号,课程)→成绩“就是完全依赖关系。
-
例2:表a(学号,姓名,性别,年龄,课程,课程老师,成绩),可以得到非完全依赖关系:(学号,课程)→(姓名,性别,年龄,课程老师,成绩),其中(姓名,性别,年龄)依赖于学号,课程老师依赖于课程,成绩依赖于(学号,课程);因此可以将一张表格拆分为三张表格:学生信息表(学号,姓名,性别,年龄)、课程表(课程,课程老师)、成绩表(学号,课程,成绩);
-
对于非主属性来说,并非完全依赖候选键,可能存在以下问题:
- 数据冗余:每条数据都有重复字段,例如一个学生报了n门课程,那么学生信息就会重复了n-1次;
- 插入异常:要求新增一门课程,但未确定学生报课名单,无法插入课程信息;
- 删除异常:要求删除所有学生信息,如果不讲课程信息保存,就会将其全部误删;
- 更新异常:调整某课程老师,所有行都要调整,否则会出现同课程不同老师的情况。
5、第三范式:冗余性
- 要求任何字段不能由其余字段派生出来,字段间不能存在冗余,即不能存在传递依赖。
- 表a(学号,姓名,性别,年龄,学院,学院电话),可以得到传递依赖关系:学院电话→学院→学号,而非主属性学院电话依赖于非主属性学院,这是不允许存在的。因此需将表拆分为2张表:学生信息表(学号,姓名,性别,年龄)、学院表(学院,学院电话);
6、范式优缺点
- 优点:消除数据冗余
- 缺点:降低查询效率,因为产生的数据表过多,查询时需关联查询,代价大,也有可能使索引无效。
- 范式只是提出设计原则,实际上并不一定必须满足它。有时候为了性能上的提升,通过增加少量的冗余或重复数据提高数据库的读性能,减少表的产生和关联查询,实现以空间换取时间的目的。
7、反范式化
- 增加冗余数据提高数据库的读性能。性能比规范化更重要。
- 可以插入计算列提高查询时间
- 例如:在三范式中例子,如果经常需要学生信息和学院电话,可以在学生信息表中加入一列电话,这样会减少大量时间,虽然违反了3NF,但查询效率提高了。
- 缺点:
- 存储空间增大
- 更新、修改、删除数据需要消耗系统资源
- 数据量小的情况下,范式不能体现出性能优势,反而使得数据库设计更复杂
- 使用场景:冗余信息有价值或能够大量的减少查询时间提高效率,采取反范式化
- 增加冗余字段条件:不需要经常修改,查询时候不可或缺。
小结
第一范式规定表中的每个列应该是不可分割的最小单元;
第二范式是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部份依赖;
第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。
使用三大范式的优点:结构简单、表逻辑和条理性更强,并且第三范式很大程度上减少了表的冗余数据,节省了数据库的存储空间。