Module 02 · Using Relational Databases
Normalization数据库规范化
欢迎学习数据库规范化。通过本指南,您将能够掌握规范化的目的,并深入理解第一、第二及第三范式的定义与应用。
规范化的目的与意义
在管理书店书籍等数据记录时,不可避免地会出现数据不一致和重复信息。
- 冗余问题:重复数据会导致更新时的额外工作。如果数据分布在多个地方,必须同步修改,否则会导致数据不一致。
- 规范化定义:通过组织数据来减少冗余的过程,通常通过将大型表拆分为多个相互关联的表来实现。
规范化的核心优势
- 加速交易处理:由于在规范化的数据库中只需执行一次更新、添加或删除操作,从而提高了处理速度。
- 提升数据完整性:减少了“仅在一处修改而另一处未变”的情况,降低了数据冲突风险。
- 实施重点:规范化关注于对每个表进行处理,直到达到所需的范式级别。最终,所有规范化后的表共同构成一个规范化数据库。
三大核心范式 (1NF, 2NF, 3NF)
数据工程师必须熟悉以下三种主要的规范化形式:
1 第一范式 (1NF):原子性与唯一性
要求:每一行必须是唯一的,且每个单元格必须只包含单一值。
- 案例分析:假设一个书籍表中的“格式”列同时记录了“平装, 精装”。这违反了 1NF。
- 处理方法:
- 将包含多个值的单元格拆分。
- 增加额外的行,使“平装”和“精装”各占一行。
- 结果:每个单元格现在只有一个条目,满足 1NF。
2 第二范式 (2NF):消除部分依赖
要求:必须先满足 1NF,并创建新表来分离应用于多行的值组。
- 案例分析:如果书籍 ID
401有两种格式(平装和精装),在 1NF 下它必须列出两次。此时,“书名”和“作者”信息在两行中是重复的。 - 处理方法:
- 将表拆分,使书籍的“格式”信息与不相关的“书名”、“作者”信息分离。
- 建立关联:确定主键 (Primary Key) 与 外键 (Foreign Key)。
- 示例:
书籍 ID作为“书籍表”的主键,并作为“格式表”的外键。
- 结果:消除了非键属性对部分主键的依赖(在复合主键情况下尤为重要)。
3 第三范式 (3NF):消除传递依赖
要求:必须先满足 1NF 和 2NF,并消除任何不直接依赖于主键的列。
- 案例分析:假设表中有“出版社”和“发货地”列。发货地取决于“出版社”的位置,而不是直接取决于“书籍 ID”。
- 处理方法:
- 将“出版社”和“发货细节”分离到专门的“出版社表”中。
- 原表仅保留指向出版社表的引用。
- 结果:所有列都直接依赖于主键。
规范化与反规范化 (Normalization vs. Denormalization)
根据应用场景的不同,规范化的程度也有所区别:
| 系统类型 | 范式要求 | 目的 |
|---|---|---|
| 事务系统 (OLTP) | 通常为 3NF | 频繁读写,旨在高效处理和存储单笔交易,确保写入完整性。 |
| 分析系统 (OLAP) | 可能进行反规范化 | 以读取为主(如数据仓库),优先考虑读取性能而非写入完整性。 |
提示
高级范式:除了前三范式,还有 BCNF(Boyce-Codd 范式,3NF 的扩展)、第四范式和第五范式,通常用于特定的复杂场景。
总结回顾
- 规范化:减少冗余,增强一致性。
- 1NF:行唯一,单元格值单一(原子性)。
- 2NF:满足 1NF,分离重复的值组到新表。
- 3NF:满足 2NF,消除不依赖于主键的列(消除传递依赖)。