在一个维度之间加入多个事实表

10
如果请求的报告需要关于相同维度(且以相同粒度)的汇总信息,但基础数据存储在不同的事实表中,那么数据仓库设计的好方法是什么?
例如,当薪水和支出记录在不同的事实表中时,显示每个员工每年支付的总薪水和报告的总支出的报告。或者,当销售来自一个事实表,接收来自另一个事实表时,列出每个SKU销售的每月总销售额和每月收到的库存。
朴素地解决这个问题似乎很容易:并行查询和聚合两个事实表,然后将聚合结果在数据仓库或客户端应用程序中拼接在一起。
但我也对其他解决此问题的方法感兴趣。其他人是如何解决这个问题的? 我想知道数据仓库模式和设计以及使该设计友好的客户端工具生成像上面示例中的报告。
此外,“维度三明治”用例在规范的数据仓库术语中是否有名称? 如果是,那将更容易通过Google进行研究。
我们正在使用SQL Server,但我目前的问题希望是平台中立的。

1
您还可以考虑使用合并事实表 - Marek Grzenkowicz
汇总事实表也是引入有用的附属或派生数据的一种方式。例如,使用库存和销售数据计算库存周转率的方法有很多种,通常(但并非总是)建议准备要在ETL阶段中使用的列,引导业务用户使用相同的计算方法。 - momobo
汇总事实表在某些情况下可以正常工作,但我们的数据仓库业务用例中许多都有简单的维度(与上述需要专家计算的库存情况不同),并且需要在结果定义之前支持自适应过滤和聚合。 - Justin Grant
1
但是,通过@MarekGrzenkowicz提供的有用的Kimball链接,我能够找到Drilling Across,这正是我试图解决的问题。 - Justin Grant
2个回答

10
我今天了解到这种技术被称为穿透式钻取

穿透式钻取是指针对两个或多个事实表分别进行查询,其中每个查询的行标题由相同的符合属性组成。通过对共同维度属性行标题执行排序合并操作,将来自两个查询的答案集进行对齐。BI工具供应商使用不同的名称来引用此功能,包括stitch和multipass query。

听起来像上面的天真解决方案(并行查询多个事实表并将结果拼接在一起)也是建议的解决方案。

更多信息:

非常感谢@MarekGrzenkowicz指引我找到自己的答案!我在这里回答,以防其他人寻找同样的内容。


第二个链接已经过时,但我找到了另一篇博客提到了三种不同的技术:http://blog.chrisadamson.com/2011/12/three-ways-to-drill-across.html - Paul
第二个链接已经过时了,但我找到了另一篇博客提到了三种不同的技术:http://blog.chrisadamson.com/2011/12/three-ways-to-drill-across.html - undefined

4

您所描述的“朴素解决方案”大多数情况下都是首选。

常见的例外情况是,当您需要使用另一个事实表过滤一个事实的详细行时。例如,“显示我们今年未出售的文章的资本捆绑(库存)”。您不能简单地在一个查询中总结资本捆绑。在这种情况下,如果您能够在共同粒度上表示两个度量,则可以使用合并的事实作为解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接