首页 >> 基础教程
关系数据库的3大范式
关系数据库的三大范式(1NF、2NF、3NF)是数据库设计的核心原则,用于减少数据冗余、避免更新异常,并确保数据一致性。
范式核心目标总结表
范式 | 核心要求 | 解决什么问题 | 违反时的典型问题 |
---|---|---|---|
1NF | 列原子性(不可再分) | 数据存储的规范性 | 重复存储、查询困难 |
2NF | 消除非主属性对主键的部分依赖 | 部分数据冗余 | 更新异常(修改部分数据需多次操作) |
3NF | 消除非主属性对主键的传递依赖 | 间接依赖导致冗余 | 删除或更新时丢失关联数据 |
详细解析与示例
1. 第一范式 (1NF):确保列的原子性
要求:
每列都是不可再分的原子值(不能是数组、集合或复合结构)。
每行有唯一标识(通常用主键)。
反例:
订单ID | 商品 |
1001 | 手机,耳机 |
商品列包含多个值,违反1NF
符合1NF的设计:
订单id | 商品 |
1001 | 手机 |
1002 | 耳机 |
拆分多行,每行一个值
2. 第二范式 (2NF):消除部分依赖
前提:已满足1NF。
要求:
非主属性必须完全依赖于整个主键(针对复合主键)。反例:
学生id 课程id 学生姓名 课程成绩
问题:学生姓名 只依赖 学生ID(部分依赖主键),与课程无关。
符合2NF的设计:
学生表
学成id | 学生名称 |
课程表
学生id | 课程id | 课程成绩 |
2. 第三范式 (3NF):消除传递依赖
前提:已满足2NF。
要求:
非主属性不能传递依赖于主键(即不能通过其他非主属性间接依赖主键)。反例:
订单id | 客户id | 客户姓名 | 客户地址 |
问题:客户地址 依赖于 客户ID(非主键),而 客户ID 又依赖于主键 订单ID(传递依赖)。
符合3NF的设计:
订单表
订单id | 客户id |
客户表
客户id | 客户姓名 | 客户地址 |
为什么需要范式?
减少冗余:相同数据只存一份(如客户地址)。
避免更新异常:
修改地址只需更新客户表中的一行。
防止删除丢失:
删除订单不会误删客户信息。
确保一致性:所有关联数据通过外键引用同一来源。
范式是死的,人是活的,怎么设计好处多怎么来。不要被范式束缚了。
最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30