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

Designing a Data Warehouse/ Star Schema - Choosing facts

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

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

我想出了以下几点:

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


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

我包含的一些事实似乎与粒度不符:TotalNumberOfInvestors、TotalAmountInvestedInProject、PercentOfProjectTarget。

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

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

要么在报告工具中计算这些附加措施,要么在基础数据之上创建一组聚合事实 table。它们的颗粒度较低,并且仅引用维度的一个子集。

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

我认为"one row for each investment"是一个很好的候选谷物

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

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

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

PercentOfProjectTarget 的计算方法是 FactInvestment.InvestmentAmount 除以 DimProject.TargetAmount。进行此计算的一个约束是在您的报表中至少有一个 DimProject 成员。

希望对您有所帮助,

马克.