多个聚合级别的数据建模

Data modeling in multiple aggregation levels

我有一个关于数据建模的问题。

我有一个名为 "sales" 的 table,我在其中存储不同级别的客户销售聚合。它具有以下属性:

id (integer)
period_id (integer)
customer_id (integer)
product_category_id (integer)
channel_id (integer)
value (float)

根据填充什么"id"属性,我知道聚合的级别。例如:

如果period_id、customer_id和product_category_id都填了,但是channel_id是NULL,我就知道是所有渠道聚合的。如果 product_category_id 也为 NULL,我知道它是按所有渠道和产品类别汇总的。

与该销售额 table 的每一行相关联,我在 performance_analysis table 中有一个关联行,其中存储了这些销售额的统计分析。此 table 具有以下属性:

sales_id (integer)
and a bunch of numerical statistical values

我认为将这些不同级别的聚合存储在相同的(销售)table 中不是一个好的做法,我打算进行一些更改。我的想法是只对最分散的级别进行评分,并使用 SQL 进行聚合,即时获得每个级别的聚合。在那种情况下,"sales" table 的所有引用属性都将被填充,我将根据需要进行 GROUP BY 和 SUM。

问题是:通过这样做,我失去了与 performance_analysis table 的 1x1 关联。然后,我不得不将参考属性移动到分析table,问题仍然存在。

我仍然需要使用 NULL 属性 hack 来了解聚合级别。

重要的是要注意,聚合分析数据并非微不足道。我不能只对属性求和,它们特定于分析值。所以这不是 "sales" 情况下的数据重复。但它在同一个 table.

上仍然有不同级别的 "aggregation"

存储该数据的最佳方式是什么?

就保持最精细的销售数据而言,您肯定是在正确的轨道上。您所描述的非常像维度模型的事实 table,而 Ralph Kimball(维度建模中的关键人物)总是建议您将度量保持在尽可能低的粒度。如果您还不熟悉维度建模,我建议您阅读它,因为您正在以非常相似的方式工作,并且可能会找到一些有用的信息,既针对这个特定问题,也可能针对您需要的其他设计决策制作。

就您的统计值而言,维度建模的规则也会告诉您,您根本无法将处于不同粒度的度量存储在同一 table 中。如果您确实无法即时计算它们,请在每个聚合级别单独创建 tables,并为每个级别包含适当的 ID 列。

可能值得研究多维工具(OLAP 多维数据集等),因为有可能不是执行这些计算然后将它们存储在数据库中,而是添加一个允许这些计算的层- 以及更多 - 将在 运行 时间进行的计算。对于某些用例,这比仅限于那些在设计时定义的计算有明显的好处。它们肯定非常适合您正在创建的维度数据结构。