设计数据仓库/星型模式 - 选择事实
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】:要么在报告工具中计算这些额外的度量,要么在基础表的基础上创建一组汇总的事实表。它们的粒度会更小,并且只会引用维度的子集。
项目 似乎是一个不错的选择。它将是一个累积的快照事实表,您还可以使用它来跟踪项目的生命周期。
【讨论】:
以上是关于设计数据仓库/星型模式 - 选择事实的主要内容,如果未能解决你的问题,请参考以下文章