首页/数据/数仓建模速查/维度瘦身:拆分与合并
维度与事实设计149 条

维度瘦身:拆分与合并

属性过多且更新频率差异大时,可拆分为核心维与扩展维按需关联;低基数长文本走编码表引用,控制维表宽度。

数仓建模速查数据更新于 2026-10-13

维度瘦身是什么

维度瘦身指维表属性过多、更新频率差异过大时,按使用频次与变更频率把属性拆分:核心维保留高频且稳定的属性,扩展维承载低频或长文本属性,查询时按需关联。另一条手段是把低基数的长文本换成编码引用,用一张小字典表替代重复存储。目标是控制行宽与更新成本,而不是把表拆得越碎越好。

基本信息

拆分依据属性使用频次与变更频率
典型形态dim_xxx 核心 + dim_xxx_ext 扩展
编码替代长文本属性换字典键,字典单独维护
收益行窄、重刷成本低、更新互不牵连
代价查询需要多一次 join,模型复杂度上升

典型使用场景

  • 用户画像扩展:标签、偏好类属性变化频繁,单独放扩展表
  • 商品详情:长文本描述与图片地址体积大,按需关联
  • 低频属性隔离:一年用几次的审计字段不进核心维
  • 存储与扫描优化:核心维变窄后,常用查询扫描量显著下降
  • 更新解耦:扩展表高频更新不影响核心维的发布时间
  • 权限隔离:敏感属性放独立表,只对有权限的角色开放

拆表与按需关联

拆表与按需关联
-- 核心维:常用且稳定的属性
dim_user      -- user_sk, user_id, name, tier, city_code

-- 扩展维:低频或高频变更的属性
dim_user_ext  -- user_sk, profile_json, tags, last_active_at

-- 常用口径只 join 核心维,避免宽表全量重刷
SELECT d.tier, count(1)
FROM   dim_user d
WHERE  d.is_current = 1
GROUP  BY d.tier;

-- 需要画像时再补一次关联
SELECT d.user_id, e.tags
FROM   dim_user d
JOIN   dim_user_ext e ON d.user_sk = e.user_sk
WHERE  d.is_current = 1;

瘦身手段对照

手段做法副作用
核心与扩展拆表按变更频率分表多一次 join,扩展表可能缺行
长文本换编码字典表 + 编码列取值要先查字典,跨表需带字典
低基数枚举压缩tinyint 存编码可读性下降,要看字典注释
父子维替代重复行层级属性拆成上下级键上钻路径变长
冷属性归档历史值移出主表回溯时需额外取归档
拆分要控制 join 次数:拆成五六张小表后,简单查询也要多次关联,易用性与执行效率双降。判断标准是常用口径能否只用核心维完成;若不能,说明拆错了边界。

易错点

  • 拆得过碎:取一个常用指标要 join 五张表,开发效率与查询性能一起下降
  • 扩展表与核心表更新频率不同步:核心维已换版本、扩展表还是旧键,属性对不上
  • 扩展表缺行:核心维有成员而扩展维没有,用 inner join 会静默丢成员
  • 拆完不更新模型文档:下游不知道属性搬到哪,重复自建临时维表
  • 把高基数字符串只做编码不建字典:编码成无意义数字,反而要靠人工查映射

数据来源与参考

  • 维度建模实践:维度瘦身
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌