【离线数仓项目】——数据模型开发实战

摘要

本文主要介绍了电商业务背景下的离线数据仓库项目,包括业务域划分、核心业务域、业务核心流程以及电商业务数据模型。详细阐述了如何基于业务职能和数据主体进行业务域划分,如用户域、交易域等,并列举了电商核心业务域的主题域及其特点和实例。同时,对支付业务数据模型中的各类表进行了详细说明,如订单相关表、支付相关表等。最后,还介绍了电商数仓业系统方案设计以及DataWorks实战操作的各个步骤。

1. 电商业务背景

集团或公司业务复杂且较为庞大时,可创建业务分类,对数据进行业务区分,便于对业务数据进行更加方便的管理。在数仓(数据仓库)工程中,业务域分类的实现主要是基于数据建模数据治理 来组织和管理数据,使其符合业务需求,提高数据可用性。以下是常见的业务域分类实现方式:

1.1. 电商业务域划分

例如,如何划分数据域:

业务域的划分通常基于业务职能数据主体,例如:

  • 用户域(User Domain):包含用户基本信息、账户信息、行为数据等。
  • 交易域(Transaction Domain):存储交易记录、支付流水等。
  • 授信域(Credit Domain):存储授信审批、额度管理等信息。
  • 风控域(Risk Domain):存储用户风险评分、反欺诈策略等信息。
  • 营销域(Marketing Domain):存储营销活动、推荐系统数据等。

关键点 :业务域的划分应尽可能 独立、高内聚、低耦合,并符合业务发展需求。

1.2. 电商核心业务域

|---------|------------------------------------------|----------------------|-----------------------------|
| 主题域 | 描述 | 特点 | 实例 |
| 客户域 | 包含客户的基本信息和行为数据,用于客户管理和行为分析。 | 聚焦客户数据,支持行为分析和价值评估 | 客户基本信息表、客户标签表、客户行为数据表 |
| 订单域 | 记录订单的各个环节,包括创建、支付、发货、退货等,涉及与订单处理相关的所有数据。 | 关注订单流程,支持订单处理和管理 | 订单表、订单明细表、订单支付表、订单状态表、订单配送表 |
| 产品域 | 记录与产品相关的基础信息和定价、库存、促销等数据。 | 关注产品生命周期,支持产品分析和销售优化 | 产品信息表、产品定价表、产品库存表、产品分类表 |
| 支付域 | 包含所有与支付相关的数据,包括支付方式、支付状态、支付时间等。 | 支付流程管理,支持支付验证与结算 | 支付信息表、支付状态表、支付交易表、支付流水表 |
| 库存域 | 管理库存数据,包括商品库存、库存预警、出入库记录等。 | 关注库存管理,支持库存优化和供应链管理 | 库存表、库存预警表、库存调整表 |
| 物流域 | 记录与物流配送相关的数据,包括配送状态、物流公司、运输时间等。 | 关注物流效率,支持配送流程优化和跟踪 | 物流配送表、物流跟踪表、配送状态表 |
| 营销域 | 包含营销活动、广告投放等数据,用于市场营销活动分析和效果评估。 | 关注营销数据分析,支持营销策略优化 | 营销活动表、广告投放表、活动效果表、用户积分表 |
| 财务域 | 记录企业的财务相关数据,包括收入、支出、账单等。 | 财务管理与分析,支持资金管理和对账 | 财务报表、资金流动表、账单表、财务审核表 |
| 风险域 | 包含与企业面临的各种风险(如信用风险、欺诈风险等)相关的数据。 | 风险控制与预测,支持风控模型构建与监控 | 欺诈检测表、风险评分表、风险事件记录表 |

业务过程(Business Process)是数据仓库建模中的重要概念,它决定了数据表的归属和用途。业务过程通常对应企业中的某个核心业务活动,例如用户注册、交易支付、授信审批等。业务过程(Business Process)主要是用来确定事实表(Fact Table),即DWD层的表。

在数据仓库建模时,确定数据表属于哪个业务过程,通常需要分析该表的核心业务逻辑、数据来源和使用场景。例如:

  • 交易订单表 属于 交易处理业务过程,主要用于记录订单状态和支付情况。
  • 信用评分表 属于 风控审批业务过程,用于评估用户的信用风险。
  • 活动参与表 属于 营销活动业务过程,用于分析用户的活动参与情况。

1.3. 电商业务核心流程

在数据仓库的 事实表建模 中,业务过程决定了事实表的主题。例如,支付流水事实表主要描述支付这个业务过程,授信审批事实表则描述授信审批的过程。通过准确划分业务过程,可以使数仓结构更清晰,提高数据分析的准确性和可用性。

|------------|------------------|--------------------|------------------------|-----------------------------------------------------------|------------------------------------------------------------|-------------------------------------------------|
| 业务过程 | 核心业务逻辑 | 数据来源 | 使用场景 | ODS 层(原始数据表) | DWD 层(事实表) | DIM 层(维度表) |
| 订单业务 | 用户下单,订单从创建到完成 | 订单管理系统、支付系统、物流系统 | 订单分析、销售统计、用户消费行为分析 | ods_order(订单原始表) ods_payment(支付流水表) | dwd_order_fact (订单事实表) dwd_payment_fact (支付流水事实表) | dim_user (用户维度) dim_product (商品维度) |
| 贷款审批业务 | 用户提交贷款申请,系统评估并审批 | 信贷系统、风控系统、征信数据 | 贷款审批分析、风险评估、贷后管理 | ods_loan_application (贷款申请表) ods_credit_score (信用评分表) | dwd_loan_fact (贷款审批事实表) | dim_user (用户维度) dim_risk_score (信用评分维度) |
| 营销活动业务 | 用户参与广告或促销,领取优惠券 | 广告投放平台、营销系统、用户行为数据 | 营销效果分析、用户转化率分析、广告ROI评估 | ods_campaign (营销活动表) ods_coupon (优惠券领取表) | dwd_campaign_fact (营销活动事实表) dwd_coupon_fact (优惠券使用事实表) | dim_user (用户维度) dim_campaign (营销活动维度) |
| 风控监控业务 | 监测用户交易、欺诈检测、信用评估 | 交易系统、风控系统、第三方数据 | 反欺诈分析、信用评分建模、风险控制 | ods_risk_event (风控事件表) ods_blacklist (黑名单表) | dwd_risk_fact (风控事实表) | dim_user (用户维度) dim_fraud_score (欺诈评分维度) |
| 支付业务 | 记录用户支付行为,交易完成 | 支付系统、银行接口、第三方支付机构 | 支付渠道分析、交易风控、财务对账 | ods_payment (支付流水表) ods_transaction (交易记录表) | dwd_payment_fact (支付事实表) | dim_user (用户维度) dim_payment_method (支付方式维度) |
| 用户行为分析 | 记录用户浏览、点击、购买等行为 | Web 服务器日志、APP埋点数据 | 用户行为分析、推荐系统、个性化营销 | ods_user_log (用户行为日志表) | dwd_user_behavior_fact (用户行为事实表) | dim_user (用户维度) dim_device (设备维度) |

1.3.1. 交易域

1.3.2. 风控域

1.3.3. 营销域

1.3.4. 物流域

2. 电商业务数据模型

2.1. 支付业务数据模型

在电商支付业务中,涉及到的数据表和表模型涵盖了订单、支付、用户、商品、物流、退款等多个领域。以下是电商支付业务中常见的数据表和表模型的分类以及示例:

这些表记录订单的基本信息、状态和进展。

|------------------|-----------------------------------------------|
| 数据表 | 描述 |
| order_info | 记录订单的基本信息,如订单ID、订单创建时间、订单金额、用户ID、订单状态等。 |
| order_items | 记录订单中每个商品的详细信息,包括商品ID、数量、单价等。 |
| order_status | 记录订单状态的变化,如已支付、待发货、已发货、已完成、已取消等。 |
| order_shipping | 记录订单的物流信息,包括发货时间、物流公司、物流单号、收货地址等。 |
| order_payment | 记录订单支付的详细信息,如支付方式(支付宝、微信支付等)、支付状态、支付时间、支付金额等。 |

2.1.1.1. order_info(订单信息表)

|--------------------|----------------------|----------------|
| 字段名 | 描述 | 类型 |
| order_id | 订单唯一标识符 | INT/BIGINT |
| user_id | 用户ID,指向用户表 | INT/BIGINT |
| order_status | 订单状态(如待支付、已支付、已发货等) | VARCHAR(50) |
| total_amount | 订单总金额 | DECIMAL(10, 2) |
| discount_amount | 订单折扣金额 | DECIMAL(10, 2) |
| shipping_fee | 运费金额 | DECIMAL(10, 2) |
| payment_method | 支付方式(如支付宝、微信支付、银行卡等) | VARCHAR(50) |
| create_time | 订单创建时间 | DATETIME |
| update_time | 订单更新时间 | DATETIME |
| shipping_address | 收货地址(包含省市区和详细地址) | VARCHAR(255) |
| shipping_status | 发货状态(如未发货、已发货) | VARCHAR(50) |
| payment_time | 支付时间 | DATETIME |

2.1.1.2. order_items(订单商品表)

|-----------------|-----------------|----------------|
| 字段名 | 描述 | 类型 |
| order_item_id | 订单商品项唯一标识符 | INT/BIGINT |
| order_id | 订单ID,指向订单信息表 | INT/BIGINT |
| product_id | 商品ID,指向商品信息表 | INT/BIGINT |
| quantity | 商品数量 | INT |
| price | 商品单价 | DECIMAL(10, 2) |
| total_amount | 商品总金额(单价 * 数量) | DECIMAL(10, 2) |

2.1.1.3. order_status(订单状态表)

|-------------------|---------------------|-------------|
| 字段名 | 描述 | 类型 |
| order_status_id | 订单状态ID | INT |
| order_id | 订单ID,指向订单信息表 | INT/BIGINT |
| status | 订单状态(如已支付、待发货、已发货等) | VARCHAR(50) |
| status_time | 状态变更时间 | DATETIME |

2.1.1.4. order_shipping(订单物流表)

|--------------------|--------------|--------------|
| 字段名 | 描述 | 类型 |
| shipping_id | 物流信息ID | INT/BIGINT |
| order_id | 订单ID,指向订单信息表 | INT/BIGINT |
| shipping_company | 物流公司名称 | VARCHAR(100) |
| tracking_number | 物流单号 | VARCHAR(50) |
| shipping_time | 发货时间 | DATETIME |
| delivery_time | 送达时间 | DATETIME |

这些表记录支付的详细信息和交易流水,涉及支付渠道、金额、状态等。

|-----------------------|-----------------------------------------------|
| 数据表 | 描述 |
| payment_info | 记录支付的基础信息,包括支付ID、支付方式、支付金额、支付状态、支付时间等。 |
| payment_transaction | 记录支付交易流水,包含交易ID、订单ID、支付金额、支付方式、支付状态、支付时间等。 |
| payment_gateway | 记录支付网关信息,包含支付网关类型(如支付宝、微信支付、银行卡等)、网关返回的支付信息等。 |
| refund_info | 记录退款信息,包括退款ID、退款金额、退款时间、退款状态等。 |

2.1.2.1. payment_info(支付信息表)

|-------------------|-----------------------|----------------|
| 字段名 | 描述 | 类型 |
| payment_id | 支付唯一标识符 | INT/BIGINT |
| order_id | 订单ID,指向订单信息表 | INT/BIGINT |
| payment_method | 支付方式(如支付宝、微信支付、银行卡等) | VARCHAR(50) |
| payment_amount | 支付金额 | DECIMAL(10, 2) |
| payment_status | 支付状态(如支付成功、支付失败、待支付等) | VARCHAR(50) |
| payment_time | 支付时间 | DATETIME |
| transaction_id | 交易流水号 | VARCHAR(50) |
| payment_channel | 支付渠道(如支付宝、微信、银行等) | VARCHAR(50) |

2.1.2.2. payment_transaction(支付交易流水表)

|--------------------|-------------------|----------------|
| 字段名 | 描述 | 类型 |
| transaction_id | 交易流水号 | VARCHAR(50) |
| payment_id | 支付ID,指向支付信息表 | INT/BIGINT |
| order_id | 订单ID,指向订单信息表 | INT/BIGINT |
| amount | 交易金额 | DECIMAL(10, 2) |
| status | 交易状态(如成功、失败、处理中等) | VARCHAR(50) |
| transaction_time | 交易时间 | DATETIME |

这些表记录用户的账户信息、支付历史、账户余额等。

|------------------------|-------------------------------------|
| 数据表 | 描述 |
| user_info | 记录用户的基本信息,如用户ID、用户名、邮箱、手机号、注册时间等。 |
| user_payment_method | 记录用户的支付方式信息,如绑定的银行卡、支付宝账户、微信账号等。 |
| user_balance | 记录用户账户余额信息,包括账户余额、冻结金额、可用余额等。 |
| user_payment_history | 记录用户的支付历史信息,包括支付ID、支付金额、支付时间、支付状态等。 |

2.1.3.1. user_info(用户信息表)

|-------------------|--------------------|--------------|
| 字段名 | 描述 | 类型 |
| user_id | 用户唯一标识符 | INT/BIGINT |
| username | 用户名 | VARCHAR(50) |
| email | 用户电子邮件 | VARCHAR(100) |
| phone_number | 用户手机号 | VARCHAR(20) |
| password | 用户密码(加密存储) | VARCHAR(255) |
| register_time | 用户注册时间 | DATETIME |
| last_login_time | 最后登录时间 | DATETIME |
| status | 用户账户状态(如激活、冻结、注销等) | VARCHAR(50) |

2.1.3.2. user_payment_method(用户支付方式表)

|------------------|----------------------|-------------|
| 字段名 | 描述 | 类型 |
| user_id | 用户ID,指向用户信息表 | INT/BIGINT |
| payment_method | 支付方式(如银行卡、支付宝、微信支付等) | VARCHAR(50) |
| account_number | 支付账户号码(如银行卡号、支付宝账号等) | VARCHAR(50) |
| expiry_date | 支付方式过期日期 | DATETIME |

这些表记录商品的基本信息、价格、库存等。

|---------------------|-------------------------------|
| 数据表 | 描述 |
| product_info | 记录商品的基本信息,如商品ID、名称、价格、库存、类别等。 |
| product_category | 记录商品类别信息,如商品分类ID、分类名称等。 |
| product_price | 记录商品的定价信息,包括商品ID、定价时间、价格、折扣等。 |
| product_inventory | 记录商品的库存信息,包括商品ID、库存数量、库存预警等。 |

2.1.4.1. product_info(商品信息表)

|------------------|----------------|----------------|
| 字段名 | 描述 | 类型 |
| product_id | 商品唯一标识符 | INT/BIGINT |
| product_name | 商品名称 | VARCHAR(100) |
| category_id | 商品分类ID,指向商品分类表 | INT |
| price | 商品价格 | DECIMAL(10, 2) |
| stock_quantity | 商品库存数量 | INT |
| create_time | 商品创建时间 | DATETIME |
| update_time | 商品最后更新时间 | DATETIME |

2.1.4.2. product_category(商品分类表)

|-------------------|---------------|-------------|
| 字段名 | 描述 | 类型 |
| category_id | 商品分类唯一标识符 | INT |
| category_name | 分类名称 | VARCHAR(50) |
| parent_category | 父级分类ID(如果有的话) | INT |

这些表记录与退款操作相关的信息。

|----------------------|--------------------------------------|
| 数据表 | 描述 |
| refund_request | 记录退款申请信息,包括退款ID、申请时间、退款金额、申请状态等。 |
| refund_transaction | 记录退款交易流水信息,包括退款交易ID、退款金额、退款时间、退款状态等。 |
| refund_status | 记录退款状态的变化,如退款申请中、退款处理中、退款完成等。 |

2.1.6. 交易记录表(Transaction Record Tables)

这些表记录了所有的支付交易记录,包含支付、退款、支付失败等状态。

|----------------------|---------------------------------------------|
| 数据表 | 描述 |
| transaction_log | 记录交易流水,包括交易ID、用户ID、交易类型(支付、退款等)、交易金额、交易时间等。 |
| transaction_status | 记录交易状态的变化,如待支付、支付成功、支付失败、退款成功等。 |

2.1.6.1. transaction_log(交易记录表)

|--------------------|---------------|----------------|
| 字段名 | 描述 | 类型 |
| transaction_id | 交易唯一标识符 | VARCHAR(50) |
| user_id | 用户ID,指向用户信息表 | INT/BIGINT |
| transaction_type | 交易类型(如支付、退款等) | VARCHAR(50) |
| amount | 交易金额 | DECIMAL(10, 2) |
| transaction_time | 交易时间 | DATETIME |
| status | 交易状态(如成功、失败等) | VARCHAR(50) |

2.1.6.2. transaction_status(交易状态表)

|------------------|-----------------------|-------------|
| 字段名 | 描述 | 类型 |
| transaction_id | 交易ID,指向交易记录表 | VARCHAR(50) |
| status | 交易状态(如待支付、支付成功、支付失败等) | VARCHAR(50) |
| status_time | 状态变更时间 | DATETIME |

2.1.7. 日志表(Log Tables)

这些表记录与支付相关的系统日志,包括支付请求日志、异常日志等。

|-----------------------|-----------------------------------|
| 数据表 | 描述 |
| payment_request_log | 记录支付请求的日志,包括请求时间、请求参数、请求状态、响应状态等。 |
| payment_error_log | 记录支付过程中的错误日志,包括错误码、错误消息、错误发生时间等。 |

2.1.8. 其他辅助表(Auxiliary Tables)

这些表辅助支持支付业务的管理,如优惠券、积分等。

|---------------|----------------------------------|
| 数据表 | 描述 |
| coupon_info | 记录优惠券信息,如优惠券ID、优惠券类型、使用规则、使用状态等。 |
| user_coupon | 记录用户的优惠券使用情况,包括用户ID、优惠券ID、使用时间等。 |
| user_points | 记录用户的积分信息,包括用户ID、积分数、积分变动历史等。 |

2.2. 交易业务数据模型

2.3. 物流业务数据模型

2.4. 营销业务数据模型

3. 电商数仓业系统方案设计

预期的分层划域,下图中从下到上数仓分层,从左到右划分数据域。这里您仅需了解一下概貌,后面会一步一步配置,蓝色字体为本实验中需要使用到的表,需将模型发布至引擎生成物理表。

4. DataWorks实战操作

数据域是联系较为紧密的数据主题的集合,通常是根据业务类别、数据来源、数据用途等多个维度,对企业的业务数据进行的区域划分,将同类型数据存放在一起,便于您快速查找需要的内容。不同使用目的数据,分类标准不同。例如,电商行业通常分为交易域、会员域、商品域等。数据域是一个较高层次的数据归类标准,是对企业业务过程进行抽象、提炼、组合的集合,是企业业务人员在使用数据时第一个分组入口,可以帮助企业业务人员快速的从海量的数据中快速圈定到自己的业务数据。

4.1. 数据域构建

4.2. 业务域构建

4.3. 业务过程构建

4.4. 数据建模构建

4.5. 数据分层构建

数仓分层、数据域、业务过程、数据集市、主题域等要素,共同确定了您此次建模的逻辑数仓架构。其中,数据域及业务过程位于公共层,用于公共层数据模型的构建。数据集市及主题域位于应用层,用于面向具体业务应用的模型构建。

数仓分层保障了数据在进入数据仓库之前都经过清洗和过滤,使原始数据不再杂乱无章,优化了查询过程,有效的提高了数据获取、统计和分析的效率。同时,数仓分层实现了各种不同维度数据的关联,使多维分析更加方便,为从多角度、多层次的数据分析和决策制定提供便捷。

4.6. 数据集市构建

|---------------|---------------------------------------|------------------------------------------|
| 专注特定业务领域 | 数据集市面向特定业务领域或部门,提供该领域相关的数据支持。 | 销售数据集市:仅包含与销售相关的订单、收入、客户等数据。 |
| 简化数据访问 | 数据集市规模小,结构简单,便于特定用户群体快速访问和分析数据。 | 财务数据集市:财务人员可以快速访问到所需的财务报表、现金流等数据。 |
| 提高查询性能 | 数据集市只包含与特定业务相关的数据,查询响应速度更快。 | 营销数据集市:针对广告投放数据和活动效果的分析提供快速查询响应。 |
| 降低开发和维护成本 | 数据集市比完整的数据仓库规模小,开发和维护成本较低,且实现和部署更为简便。 | HR数据集市:人力资源部门能够快速构建和维护员工信息、薪酬福利、招聘等数据支持。 |
| 支持部门决策 | 数据集市为特定部门或业务团队提供数据支持,帮助其做出决策。 | 销售数据集市:销售团队可以进行销售趋势预测、客户行为分析等支持决策的分析。 |

数据集市的特点

|------------|-------------------------------------------|-----------------------------------|
| 面向特定业务 | 数据集市通常专注于某个特定的业务领域,服务于特定部门或用户群体。 | 销售数据集市:聚焦于销售相关数据。 财务数据集市:聚焦于财务数据。 |
| 规模小、灵活 | 数据集市相比整个数据仓库规模较小,能够灵活快速地响应特定业务需求。 | 营销数据集市:围绕营销活动和广告投放展开,规模较小但十分灵活。 |
| 查询效率高 | 数据集市包含特定领域的数据,能提高查询性能,避免冗余数据存储。 | 销售数据集市:快速查询销售订单、客户数据。 |
| 支持快速开发 | 因为数据集市的规模较小且与特定业务需求紧密对接,开发和实施周期短,能更快投入使用。 | 财务数据集市:可快速为财务部门提供实时的财务数据支持。 |

数据集市示例

|------------|-------------------------------------------|---------------------------------------------------------------------------------|
| 销售数据集市 | 主要包含与销售相关的所有数据,专门为销售团队或部门提供数据支持。 | sales_order(销售订单表) sales_revenue(销售收入表) customer_info(客户信息表) |
| 财务数据集市 | 包含财务相关的所有数据,专门为财务团队提供报表、资金流动等分析支持。 | account_balance(账户余额表) cash_flow(现金流表) profit_loss(利润表) |
| 营销数据集市 | 存储与广告投放、营销活动相关的数据,支持营销部门分析活动效果、广告ROI等。 | campaign_participation(营销活动参与表) ad_exposure(广告曝光表) user_engagement(用户参与表) |
| HR数据集市 | 存储与员工信息、薪酬福利、绩效评估、招聘等相关的数据,专门为人力资源部门提供支持。 | employee_info(员工信息表) employee_performance(员工绩效表) salary_data(薪酬数据表) |

博文参考

  • 《阿里巴巴大数据实战》
  • 《大数据离线数仓实战》