数据库结构优化的目的是为了
减少数据冗余
尽量避免数据维护中出现更新,插入和删除异常.
节约数据存储空间
提高查询效率
数据库设计范式
第一范式
数据库表中的所有字段都自由单一属性
单一属性的列是由基本的数据类型锁构成的
设计出来的表都是简单的二维表
综上: 几乎只要能在当今数据库中建立起来的表都是第一范式,但是很可能有很大的优化空间
我们有一个学生选课表,
太过于冗余,明显可以拆成:student表+stu_course表+course表,但是这符合第一范式.
第二范式
要求一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列对只对部分主键的依赖关系。
简单说: 就是上述学生选课表中,明显出现了可以拆分为以stu_id为主键的部分和以course_id为主键的部分,stu_id和course_id组成了复合主键,但是其他属性中有很大一部分只依赖其中一个就可以确定.
所以进行改进,将其改为第二范式.
学生表
课程表
学生选课关系表
这样满足第一范式的表就呗拆分成了满足第二范式的表
第三范式
指每一个非主属性几步部分依赖于也不传递依赖于业务主键,也就是说在第二范式的基础上消除了非主属性对主键的传递依赖
对于上一次的表,我们可以明显的看出没有数据依赖已经满足了第三范式,但是为了讲解,如果我们的学生表有系的信息(系名,系主任,系楼),那么其也满足第二范式,但是数据冗余,我们将系拆分出来作为一个表,学生中只包含一个外键(系名)即可.
反范式化设计
反范式化设计就是在范式化设计的基础上,因为在各式各样的需求上,我们需要冗余数据来加快查询,或者不得不冗余数据,否则没办法完成需求.
总结范式化和反范式化
范式化:
优点
可以尽量的减少数据冗余,数据表更新快体积小
范式化的更新操作比反范式化更快(因为每一个表的大小都更小了)
缺点:
降低查询性能,因为越高的范式往往意味着更多的级联,进行更多的查询。
更难进行索引优化(因为表多了,所以索引更难建立了)
反范式化
优点
可以减少表的级联
可以更好的进行索引优化
缺点
存在数据冗余及数据维护异常
对数据的修改需要更多的成本(CPU,内存等硬件设备和人力资源)