MySQL数据库——数据库三范式

MySQL数据库——数据库三范式

大家好,这里是编程Cookbook。本文简要介绍关系型数据库设计的三范式。

数据库的三范式(3NF)是关系数据库设计中用于减少数据冗余、避免数据异常和提高数据一致性的三种规范化标准。

以下是 第一范式(1NF)第二范式(2NF)第三范式(3NF) 的详细介绍:


范式

第一范式(1NF)

要求每一列都是不可拆分的原子项

第二范式(2NF)

第二范式要求属性完全依赖于主键,而不能只依赖于主键的一部分。满足 第一范式 的基础上,解决部分依赖(Partial Dependency)的问题。

  • 关系必须满足 第一范式
  • 消除部分依赖:对于复合主键(即由多个列组成的主键),非主属性必须依赖于整个复合主键,而不是依赖于主键的一部分。

订单表中出现业务线,不同业务线的订单价格不同,那么主键就必须是订单id和业务线id(完全依赖)。

第三范式(3NF)

第三范式要求属性直接依赖于主键,不依赖于通过其他非主属性间接依赖于主键。

  • 关系必须满足 第二范式
  • 消除传递依赖:任何非主属性都不能通过其他非主属性间接依赖于主键。

总结

范式对比

范式 主要要求 目标
1NF 每个字段必须是原子值,且每个字段值不可分割 去除重复列、确保每个列的原子性
2NF 满足 1NF,且非主属性完全依赖于主键 消除部分依赖
3NF 满足 2NF,且非主属性不依赖于其他非主属性,直接依赖于主属性 消除传递依赖

第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于:

  • 2NF:消除部分依赖,非主键列是否完全依赖于主键,还是依赖于主键的一部分;
  • 3NF:消除传递依赖,非主键列是直接依赖于主键,还是直接依赖于非主键列(具有传递的依赖)。

实际应用中的使用

在实际开发中,过度遵循范式也可能会导致性能问题(例如,表之间关联过多,增加了查询的复杂性)。因此,有时在设计数据库时,我们可能会根据业务需求和性能要求做一些折衷,来提高查询性能。

三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。