跳到主要内容

宽表设计

问题

什么是宽表?什么场景需要宽表?

答案

什么是宽表

宽表是将多个维度和指标预先 JOIN 并冗余到一张表中,查询时无需关联即可获取所有数据。

范式模型 vs 宽表

对比范式模型宽表
字段数少(单表 10~30)多(可达 100~500)
冗余无/少大量冗余
查询需 JOIN直接 SELECT
写入更新简单ETL 批量写入
适用OLTPOLAP、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
  • 订单粒度:一行一笔订单,适合订单分析
  • 明细粒度:一行一条行为日志,适合路径分析
  • 粒度越细越灵活,但数据量越大

相关链接