处理两个事实粒度 - 维度模型

时间:2018-04-20 10:52:36

标签: aggregate data-modeling data-warehouse dimensional-modeling snowflake-schema

我有一个关于创建维度模型和处理不同粒度级别的问题。

我想知道这两种方法中哪一种最好,为什么。或者,如果有另一种方法会更好。

我正在使用的场景很简单:我有2个维度,Region和Customer以及1个事实,Sales。

这将成为二维表,一个用于区域,另一个用于客户,其中包含一个包含销售情况的事实表:

enter image description here

现在我想按地区汇总销售额。但我不确定哪种方法最好。

我应该按区域汇总销售额,然后将数据加入事实表,以便模型如下所示:

enter image description here

或者我应该创建一个新表来保存聚合值,并使用一个键连接回事实和区域维度表,如下所示:

enter image description here

还是有另一种方法可以击败这两种吗?

感谢您的智慧和投入。

由于

1 个答案:

答案 0 :(得分:3)

您的第一个图表允许您查询按地区汇总的事实,但我假设您希望出于性能原因预先汇总地区级结果。

聚合事实的标准技术是在您需要的级别创建一个单独的事实表,这补充了主要事实。理想情况下,您有一个查询工具,可以知道何时可以从使用聚合事实中受益。

聚合事实只有RegionKey和Sales(即区域维度的外键)。这类似于您的第二个解决方案,但是没有链接到汇总数据的事实。没有必要:你已经可以看到哪些详细的事实构成了主要事实本身的聚合。

你的第一个解决方案'混合谷物'事实并不是推荐的。事实表应该有清晰的颗粒,以便您知道每行代表什么,例如衡量对客户的销售情况。如果您包含汇总数字,这不适用于一个客户的销售(或只是一个客户密钥),如果您在查询时没有理解,您可以重复计算。事实上的措施理想情况下应该是“添加剂”。跨越所有维度:您无法将RegionSales汇总数字与区域以外的任何内容相加。

但是,现代BI工具和数据库系统的功能具有性能特征,大大减少了对聚合事实的需求。在内存关系数据模型(如Power BI中的那些)中,列式数据库(或关系数据库(如SQL Server)上的列存储索引)都可以在没有特殊聚合表的情况下快速运行这种查询。这很重要,因为让聚合表保持最新并与基础事实保持同步可能会很麻烦。