规范化把数据组织成每条事实只存在于一处,从而消除冗余。反规范化则刻意复制数据以加快读取。大多数 schema 一开始都是规范化的,只在测量结果要求时才进行反规范化。
规范化(到 3NF)
每张表描述一个实体;相关数据通过外键引用。
sql
-- 规范化:客户所在城市只存一次
customers(id, name, city_id)
cities(id, name)
orders(id, customer_id, total)
- 优点 — 没有更新异常(改一行就能改掉一个城市名)、存储更小、通过外键保证完整性。
- 缺点 — 读取需要 JOIN;一份涉及多个实体的报表可能要连接五张表。
