数据库 schema 设计在决定查询运行多快、功能实现多容易以及性能在规模下表现如何方面发挥关键作用。Schema 设计从来不是静态的。在 1 万用户有效的在 1000 万用户可能崩溃。最佳架构师重新访问 schema 选择,使结构适应规模、形状和当前系统目标。

做得好,schema 设计可以成为系统的巨大资产。它加速产品速度、减少数据重复债务,并保护团队免于后期重构。做得不好,它瓶颈一切:性能、演进,有时整个功能。

每个工程团队都遇到相同的岔路口:规范化 schema 以获得干净结构和一致性,或反规范化以获得速度和简单性。错误选择不一定导致立即问题。然而,问题通过慢查询、脆弱迁移和数月后在流量高峰或产品 pivot 期间出现的数据 bug 悄悄出现。

实际上,规范化和反规范化不是竞争方法,只是完成工作的工具。每个解决不同类型问题。规范化专注于数据完整性、最小冗余和长期可维护性。反规范化优先考虑读取效率、访问简单性和负载下性能。

在本文中,我们将详细查看两者。我们将从基础开始:范式和它们如何塑造规范化 schema。然后我们将探索反规范化和实现它的常见策略。从那里,我们将映射规范化和反规范化之间的权衡。

目标不是宣布一种方法为赢家。而是理解它们的机制、后果和理想用例。

规范化

规范化专注于:

  • 数据完整性
  • 最小冗余
  • 长期可维护性

范式

  • 第一范式(1NF):移除重复组并确保每列原子值
  • 第二范式(2NF):通过确保所有非键列依赖完整主键移除部分依赖
  • 第三范式(3NF):消除传递依赖,确保非键列只依赖主键
  • Boyce-Codd 范式(BCNF):通过移除由于重叠候选键存在的异常加强 3NF。如果一列依赖某些其他列,那么”其他列”必须足以唯一标识每行
  • 第四范式(4NF):确保表不混合多个独立一对多关系为同一实体

反规范化

反规范化优先考虑:

  • 读取效率
  • 访问简单性
  • 负载下性能

常见策略

  • 添加冗余列
  • 预计算聚合
  • 合并表
  • 存储派生数据

权衡

规范化优势

  • 数据一致性
  • 最小冗余
  • 易于维护
  • 适合写密集型

规范化劣势

  • 复杂查询
  • 多表连接
  • 读取性能可能慢

反规范化优势

  • 快速读取
  • 简单查询
  • 少连接
  • 适合读密集型

反规范化劣势

  • 数据冗余
  • 更新异常风险
  • 存储更多数据

何时使用

选择规范化当:

  • 数据完整性关键
  • 写操作频繁
  • 数据变化频繁
  • 一致性优先

选择反规范化当:

  • 读取性能关键
  • 读远多于写
  • 简单查询优先
  • 可接受一些冗余

本文为学习目的的个人翻译,译文仅供参考。

原文链接:Database Schema Design Simplified: Normalization vs Denormalization

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。