数据库三范式与反范式在大数据中的应用
请解释数据库设计中的三大范式(1NF/2NF/3NF)以及反范式化在大数据场景下的应用场景和权衡。
回答
苦行僧
一、三大范式:
1NF(第一范式): 每列不可分解(原子性)
- 示例:
地址字段不应存「北京市朝阳区」,应拆为省/市/区 - 大数据场景:通常不严格要求1NF,复杂结构用嵌套格式(JSON/Struct)更方便
2NF(第二范式): 满足1NF+非主键列完全依赖于主键
- 消除部分依赖
- 示例:
订单表(order_id, product_id, product_name, qty)→product_name只依赖product_id,应拆分
3NF(第三范式): 满足2NF+非主键列不传递依赖于主键
- 消除传递依赖
- 示例:
员工表(emp_id, dept_id, dept_location)→dept_location通过dept_id传递依赖emp_id,应拆分
二、大数据场景下的反范式化:
反范式化: 有意识地引入冗余,以空间换查询性能
常用场景:
-
宽表(Wide Table):
- 把维度字段直接冗余到事实表(如订单直接存用户名字和城市)
- 避免Join,提高查询性能
- 适用:OLAP分析、即席查询
-
预聚合(Pre-Aggregation):
- 各种粒度的汇总数据提前计算好
- 如:日/周/月聚合表
-
数据湖/列存:
- 列式存储(Parquet/ORC)降低了冗余的存储成本
- 压缩率高,冗余字段的额外空间可接受
三、权衡:
| 范式化 | 反范式化 |
|---|---|
| 存储少 | 存储多 |
| 更新简单(一处修改) | 更新复杂(多表冗余) |
| 查询慢(多表Join) | 查询快(单表Scan) |
| 数据一致性高 | 需ETL保证一致性 |
四、大数据实践建议:
- ETL层:保持范式化(DWD层规范)
- 应用层:反范式化宽表(DWS/ADS层)
- 维表:适当冗余(如用户维表包含地址多个字段)