【发布时间】:2015-11-11 04:39:32
【问题描述】:
每当星型模式中的某些数据在日级别可用,而其他数据在月级别可用时,我应该创建单独的月维度,还是在某些情况下更倾向于将月级别数据附加到日级别日期维度(例如总是在每月的第一天)?
示例:
假设我有一个在日期级别存储订单的事实表,附加到在日期级别存储日期的日期维度。
+---------+ +-----------+
| Fact | | Dim |
| Orders | | Date |
+---------+ +-----------+
| FK Date |------| FullDate |
+---------+ | MonthNr |
| Year |
+-----------+
解决方案 1:雪花日期维度,创建单独的月份维度
现在我有一些每月需要包含在模型中的销售目标。直观地说,我的反应是在月级别上创建一个维度,就像雪花一样。然后,我的日期维度将包含该月维度的 FK,因此层次结构是明确的。
+---------+ +-----------+
| Fact | | Dim |
| Orders | | Date |
+---------+ +-----------+ +-----------+
| FK Date |------| FullDate | | Dim Month | +----------+
+---------+ | Year | +-----------+ | Target |
| Month | | Year | +----------+
| FK Month |------| YearMonth |------| FK Month |
+-----------+ | Month | | Target |
+-----------+ +----------+
请注意,事实表中的确切键集(以及日期维度中的其余列)可以通过多种方式实现,具体取决于最佳、混合或标准雪花的选择
解决方案2:将月份级别的数据附加到当月的第一天
最近我看到越来越多的人将目标附加到原始日期维度,在月初:
+---------+ +-----------+
| Fact | | Dim | +----------+
| Orders | | Date | | Target |
+---------+ +-----------+ +----------+
| FK Date |------| FullDate |------| FK Date |
+---------+ | MonthNr | | Target |
| Year | +----------+
+-----------+
当数据模型主要用于客户直接访问时(例如交叉表或数据透视表中的即席分析),最后一个数据模型尤其适用。对我来说,它仍然感觉违背了规律。
在月份级别上对这些目标进行建模的最佳方法是什么?选择一种方法而不是另一种方法时,有哪些重要考虑因素?
更新
正如@SebTHU 在他的回答中指出的那样,可以在 SSAS 内部建模(并且,正如 @Nick.McDermaid 在 Cognos 中所添加的那样)一个单一维度(仅限日期),其中,由于对层次结构的了解,目标与月级别相关,而订单与日级别相关,如下所示:
+---------+ +-----------+
| Fact | | Dim |
| Orders | | Date | +-------------+
+---------+ +-----------+ | Fact Target |
| FK Date |------| FullDate | +-------------+
+---------+ | MonthKey |------| FK MonthKey |
| MonthNr | | Target |
| Year | +-------------+
+-----------+
剩下的问题是如何在关系数据库(比如 SQL Server)中实现这一点——非唯一属性不允许使用外键。那么可以采用解决方案 2,并在多维数据集加载期间重新建模吗?还是采用解决方案 1(最终没有 Dim Month 和 Dim Date 之间的 FK 关系)并在多维数据集加载期间将两个维度“合并”为一个维度是否更好?
【问题讨论】:
-
投反对票的原因是什么?
-
另一种选择是将记录添加到每个月和“未知”日的日期维度。这样你就不需要任何额外的表了。
标签: sql date ssas dimensional-modeling