角色扮演维度是什么
角色扮演维度指同一张维度表在一次分析中被多次引用、扮演不同角色。最常见的是日期维度:订单事实表里同时有下单日期、支付日期、发货日期、完成日期,它们都是同一个日历维度的不同角色。Kimball 建模的做法是只保留一张物理维度表,事实表中每个角色单独占一个外键列,查询时用不同别名多次连接同一张维表,而不是为每个角色复制一份维度数据。
基本信息
| 建模体系 | Kimball 维度建模 |
|---|---|
| 实现方式 | 一张物理维表加多个视图或查询别名 |
| 事实表要求 | 每个角色一个独立外键列 |
| 典型维度 | 日期、门店(发货与收货)、用户(买家与卖家) |
| 核心收益 | 日历或编码口径只维护一处 |
典型使用场景
- 交易分析里同时看下单日期与支付日期,衡量从下单到付款的时长
- 履约分析对比发货门店与收货门店,评估跨区调拨比例
- 撮合类业务区分买家与卖家两个用户角色
- 风控分析关联申请人与审核人,追溯同一审核人的通过率
- 财务分析区分开票日期与入账日期,核对跨期差异
多角色连接
多角色连接
-- 一张 dim_date 扮演三个角色,各自取别名
SELECT od.date_desc AS order_date,
pd.date_desc AS pay_date,
sd.date_desc AS ship_date,
SUM(f.pay_amount) AS pay_amt
FROM fact_order f
JOIN dim_date od ON f.order_date_sk = od.date_sk -- 角色一:下单
JOIN dim_date pd ON f.pay_date_sk = pd.date_sk -- 角色二:支付
LEFT JOIN dim_date sd ON f.ship_date_sk = sd.date_sk -- 角色三:发货,可能未发
GROUP BY od.date_desc, pd.date_desc, sd.date_desc;角色与外键命名
| 维度 | 角色 | 事实表外键 | 用途 |
|---|---|---|---|
| 日期 | 下单 | order_date_sk | 交易量按业务发生日统计 |
| 日期 | 支付 | pay_date_sk | 回款与账期分析 |
| 门店 | 发货 | ship_store_sk | 发货效率与库存归属 |
| 门店 | 收货 | recv_store_sk | 区域履约与调拨分析 |
| 用户 | 买家与卖家 | buyer_sk / seller_sk | 双向用户行为分析 |
给每个角色起清晰的外键名(order_date_sk、pay_date_sk),否则两个日期列在 SQL 里极易接错,统计口径会整体偏移且不易察觉。
为每个角色复制一份日期维度表的做法必须避免:日历口径调整(新增财年字段、修改节假日标记)时容易漏改其中一份,多个角色的口径从此不再一致。
跨角色比较要留意空值语义:未发货订单的发货日期外键为空,用 LEFT JOIN 且不要把它折算成某个具体日期,否则履约时长会被算成极小值。