【问题标题】:Data modeling in multiple aggregation levels多个聚合级别的数据建模
【发布时间】:2015-08-16 12:14:39
【问题描述】:

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

我有一个名为“销售”的表,其中存储了不同级别的客户销售聚合。它具有以下属性:

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,我知道它是由所有渠道和产品类别聚合的。

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

sales_id (integer)
and a bunch of numerical statistical values

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

问题是:这样做,我失去了与 performance_analysis 表的 1x1 关联。然后,我必须将引用属性移动到分析表中,问题仍然存在。

我仍然必须使用那个 NULL 属性破解来知道聚合的级别。

请务必注意,汇总分析数据并非易事。我不能只对属性求和,它们特定于分析值。因此,这不是“销售”案例中的数据重复。但它仍然在同一张表上具有不同级别的“聚合”。

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

【问题讨论】:

    标签: mysql database postgresql data-modeling


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-20
      • 2020-03-19
      • 2021-05-11
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多