设计数据仓库/星型模式 - 选择事实

Posted

技术标签:

【中文标题】设计数据仓库/星型模式 - 选择事实【英文标题】:Designing a Data Warehouse/ Star Schema - Choosing facts 【发布时间】:2015-03-04 15:35:20 【问题描述】:

考虑一个众筹系统,世界上任何人都可以投资一个项目。

我已经有了规范化的数据库设计,现在我正在尝试创建一个数据仓库 (OLAP)。

我想出了以下几点:

这已被非规范化,我选择投资作为事实表,因为我认为以下示例可能是有用的业务需求:

按项目类型查看投资 按时间段划分的投资,即每周投资总额等。

阅读了一些资料(数据仓库工具包:Ralph Kimball),我觉得我的架构不太正确。这本书说要声明谷物(在我的情况下是每个投资),然后在声明的谷物的上下文中添加事实。

我列出的一些事实似乎与事实不符:TotalNumberOfInvestors、TotalAmountInvestedInProject、PercentOfProjectTarget。

但我觉得这些可能很有用,因为您可以在投资时看到这些金额。

这些事实看起来合适吗?最后,TotalNumberOfInvestors 事实是否隐含地引用了 Investor 维度?

【问题讨论】:

【参考方案1】:

我认为“每项投资一行”是一个很好的候选谷物。

事实表设计的问题在于,在数据应用程序 (olap cube) 中包含的列实际上应该是计算。

TotalNumberOfInvestors 可以通过对投资者的不同计数来计算。

TotalAmountInvestedInProject 应该从事实表中删除,因为它实际上是一个带有假设的计算。尝试按项目分组,然后取 InvestmentAmount 的总和,这是一种更自然的方法。

PercentOfProjectTarget 的计算方法是将 FactInvestment.InvestmentAmount 的总和除以 DimProject.TargetAmount 的总和。进行此计算的一个限制条件是您的报告中至少有一个 DimProject 成员。

希望对你有帮助,

标记。

【讨论】:

【参考方案2】:

要么在报告工具中计算这些额外的度量,要么在基础表的基础上创建一组汇总的事实表。它们的粒度会更小,并且只会引用维度的子集。

项目 似乎是一个不错的选择。它将是一个累积的快照事实表,您还可以使用它来跟踪项目的生命周期。

【讨论】:

以上是关于设计数据仓库/星型模式 - 选择事实的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库与数据挖掘

数据仓库星型模式事实表?你怎么知道里面有啥

数据仓库三大数据模式

数据仓库星型模式的维度表和事实表中的数据如何?

有任何 ETL/建模工具来创建 ROLAP 星型模式数据仓库吗?

数据仓库介绍 - 星型模型与雪花模型