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

大家好,这里是编程Cookbook。本文简要介绍关系型数据库设计的三范式。
数据库的三范式(3NF)是关系数据库设计中用于减少数据冗余、避免数据异常和提高数据一致性的三种规范化标准。
以下是 第一范式(1NF)、第二范式(2NF) 和 第三范式(3NF) 的详细介绍:
范式
第一范式(1NF)
要求每一列都是不可拆分的原子项。
第二范式(2NF)
第二范式要求属性完全依赖于主键,而不能只依赖于主键的一部分。满足 第一范式 的基础上,解决部分依赖(Partial Dependency)的问题。
- 关系必须满足 第一范式。
- 消除部分依赖:对于复合主键(即由多个列组成的主键),非主属性必须依赖于整个复合主键,而不是依赖于主键的一部分。
订单表中出现业务线,不同业务线的订单价格不同,那么主键就必须是订单id和业务线id(完全依赖)。
第三范式(3NF)
第三范式要求属性直接依赖于主键,不依赖于通过其他非主属性间接依赖于主键。
- 关系必须满足 第二范式。
- 消除传递依赖:任何非主属性都不能通过其他非主属性间接依赖于主键。
总结
范式对比
范式 | 主要要求 | 目标 |
---|---|---|
1NF | 每个字段必须是原子值,且每个字段值不可分割 | 去除重复列、确保每个列的原子性 |
2NF | 满足 1NF,且非主属性完全依赖于主键 | 消除部分依赖 |
3NF | 满足 2NF,且非主属性不依赖于其他非主属性,直接依赖于主属性 | 消除传递依赖 |
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于:
- 2NF:消除部分依赖,非主键列是否完全依赖于主键,还是依赖于主键的一部分;
- 3NF:消除传递依赖,非主键列是直接依赖于主键,还是直接依赖于非主键列(具有传递的依赖)。
实际应用中的使用
在实际开发中,过度遵循范式也可能会导致性能问题(例如,表之间关联过多,增加了查询的复杂性)。因此,有时在设计数据库时,我们可能会根据业务需求和性能要求做一些折衷,来提高查询性能。
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。