MySQL数据库设计原则

350 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

设计原则

  • 减少数据冗余(数据多次出现,或者一列数据可以通过其他列查询得出)

  • 尽量避免数据 维护中出现插入,更新、删除异常

  • 节约数据存储空间

  • 提高查询效率

范式化设计和反范式化设计

数据库三范式

第一范式

数据库表中所有字段都只具有单一属性,不可在拆分;单一属性的列是由基本的数据类型所构成;设计出来的表都是简单的二维表

第二范式

要求一个表只具有一个业务主键,符合第二范式的表中不能存在非主键列只对部分主键的依赖关系,例如一个订单表,订单表的主键是订单ID,那么该订单表其他字段都应该依赖订单ID,该表存在一个商品ID,不依赖订单ID,这就不满足第二范式

第三范式

满足第二范式的基础上,每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖;简单理解就是非主键字段不能相互依赖。例如有个订单表有订单ID,顾客姓名,顾客编号,这其中顾客姓名和顾客编号是有依赖关系的,顾客编号和订单编号也相关,最后经过传递依赖,顾客姓名和订单编号相关,所以就不符合第三范式

范式化设计的优缺点

优点

  • 可以减少数据冗余

  • 数据表更新快体积小

缺点

  • 容易出现数据查询时表关联太多导致查询效率变慢

  • 更难进行索引优化

反范式化设计

image.png

对于图中的表,就进行了反范式化设计,将原表结构中的商品分类中间表消除,将分类名称放入商品信息表,虽然有一点数据冗余,但是在进行查询时却减少了更多的表关联,提高了查询效率,尤其对这种查询次数多的表,可以大大提高效率,虽然不符合第二范式,但是适当的以空间换时间,也是可取的,反范式化设计适用于对数据不进行改变的表,例如订单表,每一个订单生成都不应该改变其中的数据,例如商品,价格

反范式化设计的优点

  • 可以减少表的关联

  • 可以更好的进行索引优化

反范式化的缺点

  • 存在数据冗余和数据维护异常

  • 对数据的修改需要更多的成本