数据仓库中Invoice与Project事实表关系及模型合理性咨询
数据仓库建模问题解答
1. 当前数据模型正确性判断
你没给出当前具体的数据模型结构,没法直接判定对错。不过结合你的业务场景,给几个参考方向:
- 关联项目的发票,要确保通过
project_id在发票事实表和项目维度表之间建立有效关联; - 独立发票的情况,对应的项目维度字段可以设为
NULL,保证数据能兼容两种业务场景。
2. 是否将Project度量指标纳入Fact Invoice
不建议这么做,原因如下:
- 发票事实表的核心是聚焦发票本身的交易度量,比如发票金额、税额、开票数量这类和发票强相关的数据;
- 项目的度量(比如项目预算、已完成里程碑数、项目总成本)属于项目业务范畴,应该单独建一个
Fact Project事实表来存储; - 如果需要做发票和项目的关联分析,直接通过项目维度表作为桥梁,查询时关联两个事实表即可,不用强行把不同业务的度量堆在同一个事实表里。
3. 数据模型合理性参考
针对你的业务场景,合理的模型框架大概是这样:
- 维度表:
Dim Project(存储项目基本属性:ID、名称、所属客户、起止时间等)、Dim Invoice(存储发票类型、开票日期、付款状态等属性)、Dim Date(日期维度,用于时间维度的分析); - 事实表:
Fact Invoice(记录每笔发票的交易数据,关联项目的发票填写project_id,独立发票该字段留空);如果有项目里程碑的业务需求,还可以新增Fact Project Milestone来记录里程碑完成情况; - 这种结构既能保证每个事实表专注单一业务事件,又能支持跨业务场景的关联分析。
4. 数据仓库是否允许多个事实表
完全允许,这是数据仓库建模里的常见做法。不同的业务事件(比如开出发票、完成项目里程碑、收到客户付款)对应不同的事实表,每个事实表只负责一类业务活动的度量存储,这样既保证数据结构清晰,也能提升查询效率。
内容的提问来源于stack exchange,提问作者sanaz amini
相关产品推荐
相关产品推荐

