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

Dealing with two fact granularities - Dimensional Model

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

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

我使用的场景很简单:我有 2 个维度,区域和客户以及 1 个事实,销售。

这变成了二维 tables,一个用于地区,另一个用于客户,事实 table 包含销售额,如下所示:

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

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

或者我应该创建一个新的 table 来保存聚合值,并用一个键连接回事实和区域维度 table,它看起来像这样:

或者是否有另一种方法可以击败这两种方法?

感谢您的智慧和意见。

谢谢

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

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

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

你的第一个解决方案 'mixes the grain' 不推荐。事实 tables 应该有一个明确的粒度,这样你就知道每一行代表什么,例如对客户的销售量度。如果您包括汇总数字,则这不适用于一个客户的销售(或仅适用于一个客户密钥),如果您在查询时不理解这一点,则可能会重复计算。理想情况下,事实中的度量值应在所有维度上 'additive':您无法将 RegionSales 汇总数据与区域以外的任何内容相加。

但是,现代 BI 工具和数据库系统的功能具有性能特征,可以大大减少对聚合事实的需求。列式数据库(或关系数据库上的列存储索引,例如 SQL 服务器)、内存关系数据模型(例如 Power BI 中的数据模型)都有助于这种查询 运行 快速而无需特殊聚合 table秒。这很重要,因为让您的聚合 table 保持最新并与您的基本事实同步可能会很痛苦。