如何存储蒙德里安查询的数据?
Posted
技术标签:
【中文标题】如何存储蒙德里安查询的数据?【英文标题】:How to store data for mondrian queries? 【发布时间】:2019-07-29 10:02:37 【问题描述】:我试图了解我应该如何存储数据,以便使用 mondrian 处理的 MDX 查询来查询它。我无法存储数据,因为我不知道是否应该在数据中包含冗余。
例如,我有 YEAR_2017
及其每个季度的事实(Q1_2017
、Q2_2017
、Q3_2017
和 Q4_2017
)。
YEAR_2017
事实的度量值确实是每个季度的值的总和。同样地,我存储了TOP_HIERARCHY
值和它的CHILD_HIERACHY
值,再次产生了冗余。
结果是,当我在 TOP_HIERARCHY
中查询 YEAR_2018
时,我得到的结果是我的 TOP_HIERARCHY
的每个子值的总和,对于每个子值,每个季度的总和和年的价值。
最后我得到了完全错误的结果,所以我的问题是,我应该简单地在事实表中使用无子层次结构的值吗?
【问题讨论】:
【参考方案1】:您不应该将细粒度数据和聚合数据都保存在同一个表中。
如果您的数据正确聚合,那么您应该只在事实表中保留最原子的数据值。 Mondrian 负责将月份汇总为季度,将季度汇总为年份等。
您通常会创建一个星型模式:一个事实表和多个维度表。
对于层次结构的每个级别,每个维度都有一个列。因此,您的日期维度将有一个主键 date_id
,然后是 year
、quarter
、month_number
、month_name
、day_of_month
以及您可能想要添加以允许向下钻取的任何其他字段。
您的事实表将有 1 列用于每个维度的每个键,然后将 1 列用于每个度量。例如date_id
、customer_id
、product_id
、quantity_sold
、total_amount
。
蒙德里安模式将指定如何聚合度量(通常为sum
),并使用正确的连接、分组和聚合发出必要的 SQL 查询。
【讨论】:
谢谢,我终于想通了,但由于某种原因,原始多维数据集对聚合事实值使用了错误的值,因此我很困惑。现在我们使用最原子的数据值,在使用手工 SQL 查询仔细检查后一切正常! 我有一个需要存储自定义聚合的情况(例如,一年的总和不是其季度的总和)。蒙德里安可以吗?谢谢。 可能会添加一个“更正”事实表行,以便总数匹配。但这样做并不是一个好习惯。事实表应该只有事实,它们要么是可加的,要么不是。 非常感谢您提供这些信息。我们有技术领域之外的人希望蒙德里安可以做任何事情,因此我想改变它,但我从多个来源得到证实,这是一个坏主意。谢谢。以上是关于如何存储蒙德里安查询的数据?的主要内容,如果未能解决你的问题,请参考以下文章