Coursera 笔记

Module 02 · Using Relational Databases

Normalization数据库规范化

Coursera ↗

欢迎学习数据库规范化。通过本指南,您将能够掌握规范化的目的,并深入理解第一、第二及第三范式的定义与应用。


规范化的目的与意义

在管理书店书籍等数据记录时,不可避免地会出现数据不一致和重复信息。

  • 冗余问题:重复数据会导致更新时的额外工作。如果数据分布在多个地方,必须同步修改,否则会导致数据不一致。
  • 规范化定义:通过组织数据来减少冗余的过程,通常通过将大型表拆分为多个相互关联的表来实现。

规范化的核心优势

  1. 加速交易处理:由于在规范化的数据库中只需执行一次更新、添加或删除操作,从而提高了处理速度。
  2. 提升数据完整性:减少了“仅在一处修改而另一处未变”的情况,降低了数据冲突风险。
  • 实施重点:规范化关注于对每个表进行处理,直到达到所需的范式级别。最终,所有规范化后的表共同构成一个规范化数据库。

三大核心范式 (1NF, 2NF, 3NF)

数据工程师必须熟悉以下三种主要的规范化形式:

1 第一范式 (1NF):原子性与唯一性

要求:每一行必须是唯一的,且每个单元格必须只包含单一值。

  • 案例分析:假设一个书籍表中的“格式”列同时记录了“平装, 精装”。这违反了 1NF。
  • 处理方法:
    • 将包含多个值的单元格拆分。
    • 增加额外的行,使“平装”和“精装”各占一行。
  • 结果:每个单元格现在只有一个条目,满足 1NF。

2 第二范式 (2NF):消除部分依赖

要求:必须先满足 1NF,并创建新表来分离应用于多行的值组。

  • 案例分析:如果书籍 ID 401 有两种格式(平装和精装),在 1NF 下它必须列出两次。此时,“书名”和“作者”信息在两行中是重复的。
  • 处理方法:
    1. 将表拆分,使书籍的“格式”信息与不相关的“书名”、“作者”信息分离。
    2. 建立关联:确定主键 (Primary Key) 与 外键 (Foreign Key)。
    • 示例:书籍 ID 作为“书籍表”的主键,并作为“格式表”的外键。
  • 结果:消除了非键属性对部分主键的依赖(在复合主键情况下尤为重要)。

3 第三范式 (3NF):消除传递依赖

要求:必须先满足 1NF 和 2NF,并消除任何不直接依赖于主键的列。

  • 案例分析:假设表中有“出版社”和“发货地”列。发货地取决于“出版社”的位置,而不是直接取决于“书籍 ID”。
  • 处理方法:
    1. 将“出版社”和“发货细节”分离到专门的“出版社表”中。
    2. 原表仅保留指向出版社表的引用。
  • 结果:所有列都直接依赖于主键。

规范化与反规范化 (Normalization vs. Denormalization)

根据应用场景的不同,规范化的程度也有所区别:

系统类型 范式要求 目的
事务系统 (OLTP) 通常为 3NF 频繁读写,旨在高效处理和存储单笔交易,确保写入完整性。
分析系统 (OLAP) 可能进行反规范化 以读取为主(如数据仓库),优先考虑读取性能而非写入完整性。

提示

高级范式:除了前三范式,还有 BCNF(Boyce-Codd 范式,3NF 的扩展)、第四范式和第五范式,通常用于特定的复杂场景。


总结回顾

  • 规范化:减少冗余,增强一致性。
  • 1NF:行唯一,单元格值单一(原子性)。
  • 2NF:满足 1NF,分离重复的值组到新表。
  • 3NF:满足 2NF,消除不依赖于主键的列(消除传递依赖)。