本案例以某公司的零售事业群为例,为您介绍在构建数据中台时,如何规划业务模型中的业务板块、项目、数据域和指标等,帮助您更好的理解Dataphin的核心概念。
案例场景简介
某公司是一家横跨多个行业领域的大型企业,以零售商超起家,逐步发展到理财金融、地产等领域。其组织架构如下图,有三个独立的事业群,每个事业群都是经营责任制,财务上独立核算。该集团近来积极推进业务数字化,准备使用Dataphin来构建数据中台,选择零售事业群作为项目一期。

零售事业群的业务流程
零售事业群的业务流程,如下图所示。

零售事业群的业务形态分两大块,线上自营电商和线下商超,所涉及的主要业务流程有:
- 供货商的采购、运输、仓储。
- 消费者的下单、支付购买商品。
- 线上销售与门店销售中的大件货物需要履约配送。
- 线上与门店的营销活动,例如线上大促、 线下打折等活动。
- 售后服务,例如退换货、投诉等。
零售事业群的架构
零售事业群的现有零售架构如下图。

- 业务中台系统覆盖整个零售体系的会员(人)与商品/库存(货),并且集中处理订单与营销内容。
- 电商系统与门店系统分别对应线上零售与线下零售。
- ERP系统主要是用于供应链管理。
规划数仓
- 规划业务板块。
某公司实行的是事业部制,各事业部之间业务独立,关联极少,主要体现在以下几方面:
- 事业部之间不共享资源,人员独立、办公场地独立等。即从Dataphin的实施角度来看,事业部之间不存在共同的业务对象(业务参与人或物)。
- 事业部之间不存在业务流程的流转。零售事业群的某个作业流程(如采购、销售)与金融事业部完全无关。
- 零售板块
- 金融板块
- 地产板块
- 规划项目。
零售事业群可以作为一个项目,也可以分为多个项目归属到一个业务板块。为了管理维护方便(计算与存储资源分配), 本案例中规划了三对项目(每对项目包括开发项目和生产项目):
- ODS层项目(dummy_retail_ods_dev和dummy_retail_ods),用于存放从各个业务系统每天同步过来的原始数据.
- CDM层项目(dummy_retail_cdm_dev和dummy_retail_cdm), 用于存放企业内通用,且经常被很多业务场景使用的数据。
- ADS层项目(dummy_retail_ads_dev和dummy_retail_ads),面向业务场景。
- 划分数据域。
基于主题域的划分原则,零售事业群的数据域划分详情如下:
- 会员(消费者)域
- 商品域
- 门店域
- 交易域
- 供应链域
- 履约域
- 营销域
- 服务域
- 流量域
- 公共域
- 确定维度与业务过程。
您可以按照以下步骤,梳理维度和业务过程:
- 列举出业务活动,下表仅列举了部分业务活动。
数据域 业务活动 交易域 订单、支付 供应链域 采购、运输、仓储(入库、上架、拣选、出库、盘点等) 履约域 接单、配送 - 拆分上述步骤中每个业务活动的参与对象和业务活动中的关键节点,下表仅列举了部分参与对象和关键节点。
数据域 业务活动 参与对象 关键节点 交易域 订单 消费者、门店、商品 下单、支付、关单 注意 线下订单下单、支付、关单在POS支付那一刻就全部完成。交易域 支付 消费者 创建(支付单)、支付、关单 供应链域 采购 供应商、商品、仓库 确认采购单、预付、发货、收货、付尾款、关单 供应链域 运输、调拨 仓库、商品、承运商、门店 确认调拨单、发运、收货、关单 履约域 配送 仓库、商品、消费者 发货、收货、关单 - 确定维度及其所在的数据域。
根据上一步的拆分,将各个业务活动的参与对象集合起来,去除重复后得到的就是维度。另外,维度本身的一些属性也是重要的分析角度,也需要设置为维度。确定了维度后,按照以下原则确定维度的归属数据域:
- 有公共性的对象(即参与了多个数据域业务活动的对象),通常都设置了独立的数据域,如消费者域。
- 只参与某一个数据域的业务活动的对象归属在所在数据域。
- 维度的属性延展出来的维度,与本维度在同一个数据域。
数据域 维度 消费者域 消费者、性别、年龄层、职业等 商品域 商品、类目 门店域 门店 供应链域 供应商、仓库、承运商 - 确定业务过程
通常,业务分析只需要关注业务活动的关键节点,这些关键节点可以设置为业务过程(如果后面业务需要,可以将其他节点也设置为业务过程) 。
数据域 业务过程 交易域 下单、支付、关单;创建(支付单)、支付、支付关单 供应链域 确认采购单、预付、发货、收货、付尾款、采购关单确认调拨单、发运、收货、调拨关单 履约域 发货、收货、关单
- 列举出业务活动,下表仅列举了部分业务活动。
- 配置维度逻辑表
给一个维度添加属性字段并设置字段的来源(对应某个ODS层物理表的字段或字段计算逻辑),设置其关联维度后就可以得到维度逻辑表。下表为消费者维度逻辑表,仅列举了部分属性字段。
属性字段 说明 来源字段 关联维度 customer_id 客户ID dummy_retail_ods.s_customer.id 无 customer_name 消费者名称 dummy_retail_ods.s_customer.name 无 reg_date 注册日期 dummy_retail_ods.s_customer.reg_date 无 gender 性别 dummy_retail_ods.s_customer.gender 性别 address_id 消费者注册地址 dummy_retail_ods.s_customer.address_id 地址 地址是一个公共域维度,其维度逻辑表为下表所示,仅列举了部分属性字段。属性字段 说明 来源字段 关联维度 address_id 内部ID dummy_retail_ods.s_address.id 无 region_id 区域ID dummy_retail_ods.s_address.region_id 区域 province_id 省份ID dummy_retail_ods.s_address.prov_id 省 city_id 城市ID dummy_retail_ods.s_address.city_id 城市 district_id 区县ID dummy_retail_ods.s_address.district_id 区县 street 街道 dummy_retail_ods.s_address.street 无 address_detail 详细地址 dummy_retail_ods.s_address.addr 无 - 配置事实逻辑表
给一个业务过程添加属性字段并设置字段的来源(对应某个ODS层物理表的字段或字段计算逻辑),设置其关联维度后就可以得到事实逻辑表。下表为下单的事实逻辑表,仅列举了部分属性字段。
属性字段 说明 来源字段 关联维度 order_id 订单ID dummy_retail_ods.s_order.id 无 order_time 下单时间 dummy_retail_ods.s_order.gmt_create 无 customer_id 消费者(买家)ID dummy_retail_ods.s_order.buyer_id 消费者 order_site 订单来源平台 dummy_retail_ods.s_order.order_source 平台类型(枚举) store_id 门店ID dummy_retail_ods.s_order.store_id 门店 amount 订单金额 dummy_retail_ods.s_order.amount 无 该事实逻辑表关联了消费者维度,消费者维度又关联了地址,地址关联了地域相关的多个维度。
定义指标
下文以消费者运营团队统计最近30天内每个消费者线上下单金额为例,为您介绍如何定义其中的指标。
按照传统SQL研发方式,您可以使用以下代码,统计最近30天内每个消费者线上下单金额。
--假设今天是 2021/10/01
select customer_id
,sum(amount) as order_amt_30d
from fct_crt_ord_di
where ds >= '20210901'
and ds <= '20210930'
and order_site = 1
group by customer_id
根据上述代码为您介绍如何定义统计周期、统计粒度、统计时效、原子指标、业务限定和派生指标:- 统计周期
统计周期用于约束指标的来源数据的时间跨度,即该指标的统计周期为最近30天,也就是指定了该指标的来源数据是最近30天内创建的订单。
- 统计粒度
统计粒度是分析维度,即Group By后需要聚合的维度,该指标的统计粒度就是消费者维度。
- 统计时效
最近30天这个统计周期是以天为统计粒度的,因此该指标的统计时效是天。
- 原子指标
下单金额是该指标的原子指标,其计算逻辑为
sum(amount)
。下单金额是最基础、且不可拆分的事件。从SQL角度来看,下单金额sum(amount)
是一个简单的聚合表达式。 - 业务限定
统计周期约束了来源数据的时间跨度,其他过滤条件则进一步筛选出进入统计的数据,这些过滤条件即业务限定。该指标统计的线上订单为业务限定,其计算逻辑为
order_site=1
。 - 派生指标
最近30天每个消费者的线上下单金额,就是派生指标。