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

Tec*_*boy 1 aggregate data-modeling data-warehouse dimensional-modeling snowflake-schema

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

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

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

这变成了两个维度表,一个用于区域,另一个用于客户,其中包含一个包含销售额的事实表,如下所示:

在此处输入图片说明

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

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

在此处输入图片说明

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

在此处输入图片说明

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

感谢您的智慧和投入。

谢谢

Ric*_*ich 5

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

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

聚合的事实将只有 RegionKey 和 Sales in(即区域维度的外键)。这与您的第二个解决方案类似,但与汇总数据的事实没有任何联系。没有必要:您已经可以从主要事实本身看出哪些详细事实构成了聚合。

您的第一个解决方案“混淆了事实”,不推荐使用。事实表应该有一个明确说明的粒度,以便您知道每一行代表什么,例如对客户销售的度量。如果您包含汇总数字,则这不适用于一位客户的销售(或仅一位 customerkey),如果您在查询时不明白这一点,则可能会重复计算。理想情况下,事实中的度量应该在所有维度上都是“相加的”:您无法将 RegionSales 汇总数字与区域以外的任何内容相加。

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