如何存储蒙德里安查询的数据?

How to store data for mondrian queries?

我正在尝试了解我应该如何存储数据以便使用 mondrian 处理的 MDX 查询来查询它。我在存储数据时遇到问题,因为我不知道是否应该在数据中包含冗余。

例如,我有 YEAR_2017 及其每个季度的事实(Q1_2017Q2_2017Q3_2017Q4_2017)。

YEAR_2017 个事实的度量值确实是每个季度值的总和。同样,我存储 TOP_HIERARCHY 值及其 CHILD_HIERACHY 值,再次产生冗余。

结果是,当我为 YEAR_2018 查询 TOP_HIERARCHY 时,我得到的结果是我的 TOP_HIERARCHY 的每个子值的总和以及每个子值的总和, 每个季度的总和和当年的值。

最后我得到了完全错误的结果,所以我的问题是,我是否应该简单地在事实 table 中使用无子层次结构的值?

您不应将粒度数据和聚合数据保存在同一个 table 中。

如果您的数据聚合正确,那么您应该只保留事实中最原子的数据值 table。 Mondrian 负责将月份汇总为季度,将季度汇总为年等。

您通常会创建星型模式:一个事实 table 和多个维度 table。

每个维度都有一个层次结构的每个级别的列。因此,您的日期维度将有一个主键 date_id,然后是 yearquartermonth_numbermonth_nameday_of_month 和任何其他您可能想要添加的字段以允许向下钻取。

您的事实 table 每个维度的每个键都有 1 列,然后每个度量有 1 列。例如 date_idcustomer_idproduct_idquantity_soldtotal_amount.

Mondrian 模式将指定如何聚合度量(通常是 sum),并使用正确的连接、分组依据和聚合发出必要的 SQL 查询。