首页 >> 基础教程
关系数据库的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
客户姓名
客户地址
为什么需要范式?
-
减少冗余:相同数据只存一份(如客户地址)。
-
避免更新异常:
- 修改地址只需更新客户表中的一行。
- 防止删除丢失:
- 删除订单不会误删客户信息。
- 确保一致性:所有关联数据通过外键引用同一来源。
范式是死的,人是活的,怎么设计好处多怎么来。不要被范式束缚了。
最新文章
20.5 性能优化建议2026-05-08
20.4 复杂查询实现2026-05-08
20.3 表创建与数据初始化2026-05-08
20.2 数据库设计2026-05-08
20.1 项目需求分析:博客系统2026-05-08
19.4 自动化备份策略2026-05-08
19.3 导出和导入数据2026-05-08
19.2 恢复备份数据2026-05-05
19.1 使用mysqldump备份数据2026-05-05
18.4 实战:开发简单的学生管理系统2026-05-05

发表评论
所有评论