什么是数据库规范化?
数据库规范化(Normalization)是通过系统地改进表结构来最小化数据冗余、提高数据完整性的过程。由Edgar F. Codd在1970年代提出,至今仍是关系型数据库设计的基础。
不进行规范化会产生三种**异常(Anomaly)**现象:
- 插入异常: 插入数据时意外插入其他数据
- 删除异常: 删除数据时意外删除其他数据
- 更新异常: 更新数据时部分未更新导致数据不一致
第一范式(1NF):确保原子性
1NF条件: 所有列的值必须是原子值。一个列不能存储多个值。
1NF违反示例:
| 订单ID | 客户名 | 商品列表 |
|---|---|---|
| 1 | 张三 | 笔记本, 鼠标 |
应用1NF后:
| 订单ID | 客户名 | 商品 |
|---|---|---|
| 1 | 张三 | 笔记本 |
| 1 | 张三 | 鼠标 |
第二范式(2NF):消除部分函数依赖
2NF条件: 满足1NF,且所有非主键属性完全依赖于主键。
当存在复合主键时需要考虑。将部分依赖的属性分离到独立的表中。
第三范式(3NF):消除传递函数依赖
3NF条件: 满足2NF,且不存在A → B → C形式的传递依赖。
3NF违反示例:
| 学生ID | 学生名 | 院系代码 | 院系名 |
|---|---|---|---|
| 1 | 李四 | CS | 计算机科学 |
"院系名"依赖于"院系代码","院系代码"依赖于"学生ID",因此"院系名"是传递依赖。应将学生表和院系表分开。
规范化的优缺点
优点: 最小化数据冗余、提高数据完整性、消除异常现象
缺点: 增加JOIN操作、查询复杂度提升、可能影响性能
总结
设计数据库时,目标应是达到3NF规范化。Erdmates的AI优化功能可以自动检测当前ERD中的规范化违规并提供改进建议。