迷你维度是什么
迷你维度把等级、年龄段这类变化频繁但取值离散的属性从主维表里拆出来,单独建成一张成员数很少的小维表。事实表同时挂基础维键与迷你维键,统计时会话或订单发生时的属性值由迷你维键决定,主维表则只保留变化缓慢的属性。这样主维表的行数增长被显著抑制,代价是查询要多关联一张小表,且新增组合需要同步到事实加载逻辑。
基本信息
| 使用动机 | 主维变化慢、属性列不宜频繁新增或变更 |
|---|---|
| 结构 | 离散属性组合枚举而成的小维表 |
| 事实表 | 同时存基础维键与迷你维键两个外键 |
| 枚举量估算 | 各属性取值个数相乘,先算再建 |
| 代价 | 查询多关联一张小表,加载需处理组合缺失 |
典型使用场景
- 用户等级与年龄段:两个属性变化频繁,放进主维会让维表版本数暴涨
- 客户信用分层:分层规则每季度调整,拆成迷你维后调整只影响小表
- 商品热度分级:按销量分档的标签频繁变化,适合独立枚举
- 会话质量分档:流量域按停留时长分档,随会话确定后不再变化
- 主维瘦身:把宽表中会频繁变化的列迁出,控制版本行增长速度
迷你维度使用
迷你维度使用
-- 主维只保留变化缓慢的属性,迷你维存离散组合
-- dim_user(user_sk, user_id, user_name, city_code, ...)
-- dim_user_mini(mini_sk, tier_band, age_band, activity_level)
SELECT f.order_id,
d.user_name, -- 基础维度:姓名等慢变属性
m.tier_band, -- 迷你维度:下单时的等级分档
m.age_band, -- 迷你维度:年龄段分档
f.item_amt
FROM fact_order f
JOIN dim_user d ON f.user_sk = d.user_sk
JOIN dim_user_mini m ON f.user_mini_sk = m.mini_sk;
-- 迷你维成员数 = 各属性取值数相乘,估算后再决定是否采用迷你维与主维分工
| 属性 | 放置位置 | 原因 |
|---|---|---|
| 姓名、注册手机 | 主维 | 变化少,需要历史追溯 |
| 等级分档 | 迷你维 | 变化频繁、取值离散 |
| 年龄段 | 迷你维 | 随会话或订单时点固化 |
| 创建渠道 | 主维 | 一次确定后不再变化 |
| 活动标签 | 评估后拆出 | 变化极快时迷你维也会膨胀 |
属性组合枚举爆炸时,迷你维度会退化得比主维更大。三个属性各十种取值就是一千行,四个属性就是上万行,因此必须先估算枚举量再决定拆分。
事实加载时如果出现迷你维里不存在的组合,应补建组合而不是丢弃事实,否则会有一批行静默缺失。