小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
设计原则
-
减少数据冗余(数据多次出现,或者一列数据可以通过其他列查询得出)
-
尽量避免数据 维护中出现插入,更新、删除异常
-
节约数据存储空间
-
提高查询效率
范式化设计和反范式化设计
数据库三范式
第一范式
数据库表中所有字段都只具有单一属性,不可在拆分;单一属性的列是由基本的数据类型所构成;设计出来的表都是简单的二维表
第二范式
要求一个表只具有一个业务主键,符合第二范式的表中不能存在非主键列只对部分主键的依赖关系,例如一个订单表,订单表的主键是订单ID,那么该订单表其他字段都应该依赖订单ID,该表存在一个商品ID,不依赖订单ID,这就不满足第二范式
第三范式
满足第二范式的基础上,每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖;简单理解就是非主键字段不能相互依赖。例如有个订单表有订单ID,顾客姓名,顾客编号,这其中顾客姓名和顾客编号是有依赖关系的,顾客编号和订单编号也相关,最后经过传递依赖,顾客姓名和订单编号相关,所以就不符合第三范式
范式化设计的优缺点
优点
-
可以减少数据冗余
-
数据表更新快体积小
缺点
-
容易出现数据查询时表关联太多导致查询效率变慢
-
更难进行索引优化
反范式化设计
对于图中的表,就进行了反范式化设计,将原表结构中的商品分类中间表消除,将分类名称放入商品信息表,虽然有一点数据冗余,但是在进行查询时却减少了更多的表关联,提高了查询效率,尤其对这种查询次数多的表,可以大大提高效率,虽然不符合第二范式,但是适当的以空间换时间,也是可取的,反范式化设计适用于对数据不进行改变的表,例如订单表,每一个订单生成都不应该改变其中的数据,例如商品,价格
反范式化设计的优点
-
可以减少表的关联
-
可以更好的进行索引优化
反范式化的缺点
-
存在数据冗余和数据维护异常
-
对数据的修改需要更多的成本