1

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

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

我想出了以下几点:

星型图

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

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

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

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

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

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

4

2 回答 2

4

我认为“每笔投资一行”是一个很好的候选粮食。

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

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

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

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

希望这可以帮助,

标记。

于 2015-03-18T10:22:14.030 回答
0

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

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

于 2015-03-04T18:10:36.590 回答