4. 采购支出数据模型设计:维度建模基础

4.1 维度建模核心概念

在数据仓库领域,维度建模(Dimensional Modeling) 是面向分析查询而设计的数据组织方法,由 Ralph Kimball 提出。其核心思想是将业务度量与描述性上下文分离,形成 事实表(Fact Table) 与 维度表(Dimension Table) 的星型或雪花型结构。

核心原则:事实表记录“发生了什么”,维度表描述“谁、什么、何时、何地、为何”。两者通过外键关联,形成易于理解且查询高效的模型。

维度建模的主要优势包括:

  • 查询性能高:星型结构减少关联层级,适合大规模聚合查询。
  • 业务可理解:维度表直接对应业务实体(供应商、物料),业务人员可直接使用。
  • 扩展灵活:新增维度或度量只需添加新表或字段,不影响现有模型。
维度建模星型结构示意图 采购支出事实表 采购金额 采购数量 合同符合金额 合同编号 (FK) 合同维度表 合同编号 (PK) 合同类型 生效日期 供应商维度表 供应商编号 (PK) 供应商名称 供应商等级 物料维度表 物料编号 (PK) 物料分类 计量单位 时间维度表 日期 (PK) 年/季度/月 是否工作日 事实表通过外键与多个维度表关联,形成星型结构

4.2 采购支出事实表设计

4.2.1 粒度定义

粒度(Granularity) 是事实表中每一行所代表的事件的详细程度。对于采购支出场景,常见的粒度选择如下:

粒度级别 描述 适用场景
采购订单行项 每行记录一个采购订单中的一条物料行 最细粒度,支持明细级分析
采购订单头 每行记录一个采购订单的汇总 订单级分析,忽略物料明细
月度供应商汇总 每行记录一个供应商在一个月内的采购汇总 高层级趋势分析
推荐粒度:采购订单行项级别。该粒度既能支持最细粒度的合同符合率校验,又能通过聚合支持任意维度的汇总分析,是采购支出数据仓库的最佳实践。

4.2.2 度量字段

事实表中的度量(Measures) 是可加性数值,用于支持聚合计算。采购支出事实表的核心度量包括:

  • 采购金额:订单行项的含税或未税金额,单位统一为元。
  • 采购数量:订单行项的数量,单位与物料维度表保持一致。
  • 合同符合金额:该笔采购中符合合同条款的金额,用于计算合同符合率。
  • 合同符合数量:该笔采购中符合合同条款的数量。
  • 差异金额:采购金额与合同符合金额的差值,用于异常监控。

4.3 维度表设计

4.3.1 合同维度表

合同维度表记录采购合同的静态属性,是合同符合率校验的核心参照表。

字段名 数据类型 说明
contract_sk INT 代理键,主键
contract_id VARCHAR(50) 业务合同编号
contract_type VARCHAR(30) 合同类型(框架协议/一次性合同)
supplier_id VARCHAR(50) 供应商编号
start_date DATE 合同生效日期
end_date DATE 合同到期日期
contract_amount DECIMAL(18,2) 合同总金额
status VARCHAR(20) 合同状态(生效/过期/终止)

4.3.2 供应商维度表

供应商维度表描述供应商的静态与动态属性,支持供应商维度的采购分析。

字段名 数据类型 说明
supplier_sk INT 代理键,主键
supplier_id VARCHAR(50) 业务供应商编号
supplier_name VARCHAR(100) 供应商名称
region VARCHAR(50) 所属区域
grade VARCHAR(20) 供应商等级(A/B/C)
cooperation_start DATE 合作起始日期

4.3.3 物料维度表

物料维度表记录采购物料的分类与属性信息,支持物料维度的支出分析。

字段名 数据类型 说明
material_sk INT 代理键,主键
material_id VARCHAR(50) 业务物料编号
material_name VARCHAR(100) 物料名称
category_l1 VARCHAR(50) 一级分类
category_l2 VARCHAR(50) 二级分类
unit VARCHAR(20) 计量单位
unit_price DECIMAL(18,2) 标准单价

4.3.4 时间维度表

时间维度表是每个数据仓库的必备维度,提供日期相关的层次结构。

字段名 数据类型 说明
date_sk INT 代理键,主键(格式:YYYYMMDD)
full_date DATE 完整日期
year INT 年份
quarter INT 季度(1-4)
month INT 月份(1-12)
day INT 日(1-31)
week_day VARCHAR(10) 星期几
is_workday BOOLEAN 是否工作日
采购支出事实表与维度表关联关系 采购支出事实表 contract_sk (FK) supplier_sk (FK) material_sk (FK) date_sk (FK) 采购金额 / 合同符合金额 合同维度表 contract_sk (PK) 合同编号 / 类型 生效日期 / 到期日期 供应商维度表 supplier_sk (PK) 供应商编号 / 名称 区域 / 等级 物料维度表 material_sk (PK) 物料编号 / 名称 分类 / 计量单位 时间维度表 date_sk (PK) 年 / 季度 / 月 是否工作日 事实表通过代理键(SK)与维度表关联,支持多维度交叉分析

4.4 模型设计最佳实践

常见陷阱:
  • 粒度不一致:事实表行项粒度与维度表粒度不匹配,导致数据重复或丢失。
  • 代理键缺失:直接使用业务键作为主键,当业务键变更时导致历史数据断裂。
  • 维度表过度规范化:过度使用雪花型结构,增加查询复杂度,降低性能。

在采购支出数据仓库中,建议采用星型模型,以采购支出事实表为中心,直接关联合同、供应商、物料、时间四个维度表。该结构在查询性能与维护成本之间取得最佳平衡,特别适合合同符合率校验这类需要多维度交叉分析的场景。