● DWS层"主题"与DWD层"数据域"的区别与联系

这是数仓建模中又一个容易混淆的核心概念。理解它,就理解了"从过程记录到分析对象"的视角转换。


一、本质区别:分析视角完全不同

┌────────────┬────────────────────────────┬──────────────────────────┐
│ 维度 │ DWD 数据域(业务过程视角) │ DWS 主题(分析对象视角) │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 回答的问题 │ 业务上发生了什么 │ 围绕谁/什么做分析 │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 组织依据 │ 按业务过程(动词) │ 按分析对象(名词) │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 建模思想 │ 事件驱动,记录过程 │ 实体驱动,刻画对象 │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 粒度 │ 一条业务记录(事件级) │ 一个分析对象(聚合级) │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 数据形态 │ 事实表(明细) │ 宽表(聚合指标) │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 典型动作 │ 下单、支付、发货、登录 │ 用户、店铺、商品、品牌 │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 命名前缀 │ dwd_{域}{过程}{粒度} │ dws_{主题}{周期}{粒度} │
├────────────┼────────────────────────────┼──────────────────────────┤
│ 驱动方 │ 业务系统的业务流程 │ 分析师/运营的分析诉求 │
└────────────┴────────────────────────────┴──────────────────────────┘


二、淘宝场景直观对比

DWD 数据域:按"业务过程"组织(动词视角)

交易域(trade)── 交易过程中发生了什么?
├── dwd_trade_order_create_di 下单
├── dwd_trade_order_pay_di 支付
├── dwd_trade_order_refund_di 退款
└── dwd_trade_order_cancel_di 取消

会员域(member)── 会员身上发生了什么?
├── dwd_member_register_di 注册
├── dwd_member_login_di 登录
└── dwd_member_level_change_di 等级变更

履约域(logi)── 履约过程中发生了什么?
├── dwd_logi_shipment_di 发货
├── dwd_logi_delivery_di 妥投
└── dwd_logi_sign_di 签收

流量域(traffic)── 用户在平台做了什么?
├── dwd_traffic_page_view_di 浏览
└── dwd_traffic_item_click_di 点击

关键词都是动词:下单、支付、发货、登录、点击 —— 记录"事件"。


DWS 主题:按"分析对象"组织(名词视角)

用户主题(user)── 围绕"用户"这个对象,刻画ta的方方面面
├── dws_user_trade_1d 用户的交易表现
├── dws_user_trade_nd 用户多周期交易(1/7/30/90天)
├── dws_user_traffic_1d 用户的浏览行为
├── dws_user_logi_nd 用户的履约体验
└── dws_user_full_nd 用户全域宽表(汇总所有维度)

店铺主题(shop)── 围绕"店铺"刻画
├── dws_shop_trade_1d 店铺的销售表现
├── dws_shop_traffic_1d 店铺的流量表现
└── dws_shop_logi_1d 店铺的履约表现

商品主题(item)── 围绕"商品"刻画
├── dws_item_trade_1d 商品销售
└── dws_item_traffic_1d 商品流量漏斗

品牌主题(brand)── 围绕"品牌"刻画
└── dws_brand_trade_nd

类目主题(cate)── 围绕"类目"刻画
└── dws_cate_trade_nd

关键词都是名词:用户、店铺、商品、品牌 —— 刻画"对象"。


三、关键区别详解

区别1:动词 vs 名词

DWD:用户【下单】了 → dwd_trade_order_create_di
DWD:用户【支付】了 → dwd_trade_order_pay_di
DWD:用户【浏览】了 → dwd_traffic_page_view_di

     ⬇ 全部以"用户"为中心聚合 ⬇

DWS:这个【用户】1天/7天/30天的下单数、支付额、浏览PV、加购数
→ dws_user_full_nd

DWD 切一刀按"业务过程",DWS 切一刀按"分析对象",两个切法完全垂直。

区别2:多个 DWD 域 → 同一个 DWS 主题

一个分析对象往往横跨多个业务域:

用户主题(dws_user_xxx)的数据来源:
├── 交易域 dwd_trade_order_pay_di → 算用户的支付金额
├── 流量域 dwd_traffic_page_view_di → 算用户的浏览深度
├── 履约域 dwd_logi_delivery_di → 算用户的收货时效
└── 会员域 dwd_member_login_di → 算用户的活跃度

DWS 打破了 DWD 的"域"边界,以分析对象为中心进行横向整合。

区别3:粒度的根本转变

┌─────┬───────────────────────────┬──────────────────────────────────────────────┐
│ 层 │ 粒度 │ 例子 │
├─────┼───────────────────────────┼──────────────────────────────────────────────┤
│ DWD │ 一行 = 一次业务过程 │ 用户A在2026-06-10 14:23支付了订单X,金额99元 │
├─────┼───────────────────────────┼──────────────────────────────────────────────┤
│ DWS │ 一行 = 一个对象在一个周期 │ 用户A在2026-06-10当天共支付3笔,金额350元 │
└─────┴───────────────────────────┴──────────────────────────────────────────────┘

DWD 是"流水账",DWS 是"对账单"。

区别4:是否做聚合计算

┌──────────────┬─────────┬───────────────────────────┐
│ 处理 │ DWD │ DWS │
├──────────────┼─────────┼───────────────────────────┤
│ 业务过程记录 │ ✅ 明细 │ ❌ 已聚合 │
├──────────────┼─────────┼───────────────────────────┤
│ 维度退化 │ ✅ │ ✅(继承) │
├──────────────┼─────────┼───────────────────────────┤
│ 指标聚合 │ ❌ │ ✅ count/sum/avg │
├──────────────┼─────────┼───────────────────────────┤
│ 多周期窗口 │ ❌ │ ✅ 1d/7d/30d/90d │
├──────────────┼─────────┼───────────────────────────┤
│ 跨域整合 │ ❌ │ ✅ 横跨多个DWD域 │
├──────────────┼─────────┼───────────────────────────┤
│ 派生指标 │ ❌ │ ✅ 复购率、活跃度、客单价 │
└──────────────┴─────────┴───────────────────────────┘

区别5:稳定性差异

  • DWD 数据域:跟业务过程绑定,很稳定。淘宝从有交易那天起,"下单、支付、退款"就一直存在。
  • DWS 主题:跟分析诉求绑定,会演进。早期可能只有用户、店铺主题;后来加品牌、类目、达人、直播间主题。

四、紧密联系:DWS 完全基于 DWD 构建

虽然组织视角不同,但 DWS 的数据 100% 来自 DWD:

  1. 加工链路:DWD 是 DWS 唯一源头

DWD(多张过程事实表)
│ 按分析对象 group by
│ 按时间周期 window
│ 多域 join 整合
▼
DWS(一张主题宽表)

  1. 一个完整例子:构建"用户交易主题宽表"

– dws_user_trade_nd 的加工逻辑(简化)
INSERT INTO dws_user_trade_nd
SELECT
user_id,

-- 来自 dwd_trade_order_pay_di(支付过程)
COUNT(DISTINCT IF(dt >= '近1天', order_id)) AS pay_order_cnt_1d,
SUM(IF(dt >= '近1天', pay_amount, 0))       AS pay_amount_1d,
COUNT(DISTINCT IF(dt >= '近30天', order_id)) AS pay_order_cnt_30d,
SUM(IF(dt >= '近30天', pay_amount, 0))      AS pay_amount_30d,

-- 来自 dwd_trade_order_refund_di(退款过程)
SUM(IF(dt >= '近30天', refund_amount, 0))   AS refund_amount_30d,

-- 派生指标
pay_amount_30d / NULLIF(pay_order_cnt_30d, 0) AS avg_order_value_30d,
refund_amount_30d / NULLIF(pay_amount_30d, 0) AS refund_rate_30d

FROM (
– 横跨 DWD 多个业务过程
SELECT user_id, order_id, pay_amount, 0 AS refund_amount, dt
FROM dwd_trade_order_pay_di
UNION ALL
SELECT user_id, order_id, 0, refund_amount, dt
FROM dwd_trade_order_refund_di
) t
GROUP BY user_id;

多个DWD表(不同业务过程)→ 一张DWS表(同一分析对象)

  1. 血缘示意

dwd_trade_order_pay_di ─────┐
dwd_trade_order_refund_di ──┤
dwd_traffic_page_view_di ───┼──→ dws_user_full_nd ──→ ads_member_rfm
dwd_logi_delivery_di ───────┤
dwd_member_login_di ────────┘


五、为什么要做这个转变?

如果只有 DWD,没有 DWS

分析师要回答"用户A最近30天的综合价值",必须:
SELECT FROM dwd_trade_order_pay_di – 算支付金额
JOIN dwd_trade_order_refund_di – 减退款
JOIN dwd_traffic_page_view_di – 算浏览
JOIN dwd_logi_delivery_di – 算收货
JOIN dwd_member_login_di – 算活跃
WHERE user_id = ‘xxx’ AND dt >= …
GROUP BY user_id

问题:

  • 每个分析师都重复写一遍
  • 不同人写出的"30天支付金额"可能口径不一致
  • 大表 JOIN 慢且贵
  • 一个看板要查 5 张明细表

引入 DWS 后

SELECT * FROM dws_user_full_nd WHERE user_id = ‘xxx’ AND dt = ‘2026-06-10’;

收益:

  • 一次计算,处处复用
  • 口径统一,全公司一致
  • 性能提升一个数量级
  • 分析师无需懂底层业务过程

六、DWD 数据域与 DWS 主题的映射关系

不是一一对应,而是多对多的网状映射:

            ┌─── 用户主题 dws_user_xxx
            │

交易域 ───────┼─── 店铺主题 dws_shop_xxx
│
├─── 商品主题 dws_item_xxx
│
流量域 ───────┼─── 类目主题 dws_cate_xxx
│
履约域 ───────┴─── 品牌主题 dws_brand_xxx

会员域 ───────────── 用户主题 dws_user_xxx

同一个 DWD 域服务多个主题,同一个主题汇聚多个 DWD 域。


七、对比总结表

┌──────────┬──────────────────┬───────────────────────┐
│ 对比项 │ DWD 数据域 │ DWS 主题 │
├──────────┼──────────────────┼───────────────────────┤
│ 视角 │ 业务过程(动词) │ 分析对象(名词) │
├──────────┼──────────────────┼───────────────────────┤
│ 例子 │ 下单、支付、发货 │ 用户、店铺、商品 │
├──────────┼──────────────────┼───────────────────────┤
│ 粒度 │ 事件级明细 │ 对象级聚合 │
├──────────┼──────────────────┼───────────────────────┤
│ 时间 │ 事件发生时刻 │ 统计周期(1d/7d/30d) │
├──────────┼──────────────────┼───────────────────────┤
│ 表形态 │ 事实表 │ 宽表 │
├──────────┼──────────────────┼───────────────────────┤
│ 数据源 │ ODS │ DWD(可能多个域) │
├──────────┼──────────────────┼───────────────────────┤
│ 跨域 │ 单域内组织 │ 跨域横向整合 │
├──────────┼──────────────────┼───────────────────────┤
│ 谁定义 │ 业务流程定义 │ 分析需求定义 │
├──────────┼──────────────────┼───────────────────────┤
│ 稳定性 │ 高 │ 中(随业务演进) │
├──────────┼──────────────────┼───────────────────────┤
│ 服务对象 │ 灵活查询、下钻 │ 报表、看板、宽表查询 │
└──────────┴──────────────────┴───────────────────────┘


八、一句话总结

▎ DWD 域回答"业务上发生了什么",DWS 主题回答"围绕这个对象我能分析什么"。
▎
▎ - 联系:DWS 的所有指标都从 DWD 聚合而来,DWD 是 DWS 的唯一原料;
▎ - 区别:DWD 按业务过程横切(动词),DWS 按分析对象纵切(名词),两个切法垂直交叉;
▎ - 价值:从"流水账"升级为"用户/店铺/商品画像",是数仓从"记录业务"走向"赋能业务"的关键一跃。

简单记忆:

  • DWD 像日记:今天我下单了、支付了、收货了 —— 按事件记录
  • DWS 像档案:这个用户的消费档案、那个店铺的经营档案 —— 按对象汇总

更多推荐