数据库 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。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。