宽表设计
问题
什么是宽表?什么场景需要宽表?
答案
什么是宽表
宽表是将多个维度和指标预先 JOIN 并冗余到一张表中,查询时无需关联即可获取所有数据。
范式模型 vs 宽表
| 对比 | 范式模型 | 宽表 |
|---|---|---|
| 字段数 | 少(单表 10~30) | 多(可达 100~500) |
| 冗余 | 无/少 | 大量冗余 |
| 查询 | 需 JOIN | 直接 SELECT |
| 写入 | 更新简单 | ETL 批量写入 |
| 适用 | OLTP | OLAP、BI |
| 一致性 | 强 | 弱(需 ETL 保证) |
宽表设计原则
| 原则 | 说明 |
|---|---|
| 面向主题 | 一张宽表围绕一个分析主题(如用户、订单) |
| 预计算 | 常用聚合指标预先计算好 |
| 合理粒度 | 明确每行代表什么(一个用户?一笔订单?) |
| 适度冗余 | 高频查询的维度字段冗余,低频的不冗余 |
-- 用户宽表(DWS 层示例)
CREATE TABLE dws.user_wide (
user_id BIGINT,
username STRING,
register_date DATE,
-- 冗余维度
city STRING,
channel STRING,
-- 预计算指标
total_orders INT,
total_amount DECIMAL(18,2),
last_order_date DATE,
avg_order_amount DECIMAL(18,2),
is_active_7d BOOLEAN
)
PARTITIONED BY (dt STRING); -- 按天分区
宽表不是万能的
- 字段太多(>500)会导致列存引擎扫描变慢
- 维度频繁变化(如用户等级)需定期全量刷新
- 需要跨主题关联时,还是要 JOIN
常见面试问题
Q1: 宽表和维度建模(星型模型)怎么选?
答案:
- 星型模型:灵活性高,适合通用分析、复杂下钻
- 宽表:查询简单,适合固定报表、BI 看板
- 实践中常两者结合:DWD 用星型模型,DWS/ADS 用宽表
Q2: 宽表的粒度如何选择?
答案:
- 用户粒度:一行一个用户,适合用户画像、RFM
- 订单粒度:一行一笔订单,适合订单分析
- 明细粒度:一行一条行为日志,适合路径分析
- 粒度越细越灵活,但数据量越大