首页/数据/数仓建模速查/案例:电商交易域多过程建模
建模基础69 条

案例:电商交易域多过程建模

电商交易域四过程:下单、支付、发货、退款;共享一致性维度(用户/商品/日期/渠道),退款与订单通过原单键关联。

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

电商交易域多过程建模案例

电商交易域的典型做法是按业务过程分别建事实表:下单、支付、发货、退款,它们共享一致性维度(用户、商品、日期、渠道),并通过退化维度订单号串联。各过程独立声明自己的粒度:订单事实通常是一订单商品行一行,支付事实是一支付流水一行,退款则是负向度量行。跨过程指标在指标层组合计算,而不是把四个过程拼进一张宽事实表。

基本信息

业务过程下单、支付、发货、退款
共享维度用户、商品、日期、渠道先行做成一致性维度
串联键订单号作为退化维度留在各事实表中
粒度声明各过程独立声明,互不继承
负向处理退款不修改支付行,插负向度量行

典型使用场景

  • 下单分析:按商品与渠道看下单量与下单金额
  • 支付分析:按支付方式与时段看支付成功率与支付金额
  • 履约分析:发货与签收时效,按仓库与地区分组
  • 退款分析:退款率与退款原因,用负向行计算净额
  • 转化分析:支付金额与下单金额的比值需在同一维度上重算,不能对已有比率求平均
  • 跨过程核对:支付金额应与订单金额在一致维度下可对账

四过程事实表

四过程事实表
-- fact_order / fact_pay / fact_ship / fact_refund
-- 通过 order_id 串联,共享 dim_user / dim_product / dim_date
SELECT p.dt, sum(p.pay_amt) AS paid_amt
FROM   fact_pay p
WHERE  p.dt = '2026-10-12'
GROUP  BY p.dt;

-- 净额:退款以负向行参与,正负自相抵
SELECT order_id, sum(pay_amt) AS net_amt
FROM   fact_pay
GROUP  BY order_id;

-- 跨过程:下单金额与支付金额按同一维度对齐后比较
SELECT d.category_id,
       sum(o.order_amt) AS order_amt,
       sum(p.pay_amt)   AS pay_amt
FROM   fact_order o
JOIN   fact_pay   p ON o.order_id = p.order_id
JOIN   dim_product d ON o.product_sk = d.product_sk
GROUP  BY d.category_id;

四过程事实对照

过程粒度关键度量
下单订单 + 商品下单金额、件数、优惠金额
支付支付流水支付金额、支付方式、支付时间
发货包裹或订单发货件数、运费、承运商
退款退款流水(负向)退款金额、退款类型、原单引用
各过程分别建表、独立声明粒度,是这类模型最重要的纪律。跨过程指标(支付转化率、退款率)在指标层组合,不在一张宽事实里拼全集;把下单与支付拼进同一行看似省事,一旦出现部分支付、分批支付或支付时间与下单时间跨天,模型立刻无法表达。

易错点

  • 把下单与支付拼进同一行:部分支付、分批支付与状态演进全部无法表达
  • 跨过程直接 join 明细再求和:一对多放大,金额重复计算且不易察觉
  • 退款直接改写支付行:审计链断裂,也无法回答退款发生在何时
  • 各过程各自建私有用户维度:同一用户在下单与支付口径下对不上账
  • 不声明粒度:按订单号汇总时忽略了支付流水可能多行,订单数被放大

数据来源与参考

  • Kimball Group:电商交易域模型
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌