4. 采购支出数据模型设计:维度建模基础
4.1 维度建模核心概念
在数据仓库领域,维度建模(Dimensional Modeling) 是面向分析查询而设计的数据组织方法,由 Ralph Kimball 提出。其核心思想是将业务度量与描述性上下文分离,形成 事实表(Fact Table) 与 维度表(Dimension Table) 的星型或雪花型结构。
核心原则:事实表记录“发生了什么”,维度表描述“谁、什么、何时、何地、为何”。两者通过外键关联,形成易于理解且查询高效的模型。
维度建模的主要优势包括:
- 查询性能高:星型结构减少关联层级,适合大规模聚合查询。
- 业务可理解:维度表直接对应业务实体(供应商、物料),业务人员可直接使用。
- 扩展灵活:新增维度或度量只需添加新表或字段,不影响现有模型。
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 | 是否工作日 |
4.4 模型设计最佳实践
常见陷阱:
- 粒度不一致:事实表行项粒度与维度表粒度不匹配,导致数据重复或丢失。
- 代理键缺失:直接使用业务键作为主键,当业务键变更时导致历史数据断裂。
- 维度表过度规范化:过度使用雪花型结构,增加查询复杂度,降低性能。
在采购支出数据仓库中,建议采用星型模型,以采购支出事实表为中心,直接关联合同、供应商、物料、时间四个维度表。该结构在查询性能与维护成本之间取得最佳平衡,特别适合合同符合率校验这类需要多维度交叉分析的场景。