是否应该标注日期维度?

时间:2015-08-18 09:51:56

标签: sql date ssas dimensional-modeling

每当星级模式中的某些数据在日级别和其他月份级别上可用时,我应该创建单独的月份维度,还是在某些情况下首选将月级别数据附加到日级别日期维度(例如,始终在该月的第一天)?

实施例

我们说我有一个事实表存储日级订单,附加到日期维度上的日期维度。

+---------+      +-----------+
|  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关系)和' merge'在立方体加载期间将两个维度合并为一个维度?

2 个答案:

答案 0 :(得分:3)

可以(在SSAS2014中,无论如何)在Date维度中创建Month-> Day层次结构,然后在不同的粒度属性上使用维度切片两个度量值组。

因此,您将度量值组中的订单与“日”属性的“日期”维度相关联,但将度量值组与“目标”关联到“月”属性上的相同维度。

结果将是Targets 在个别日期没有价值,但是在Months上会有一个值(并且在层次结构中高于几个月的任何值,例如季度或年,如果你想那些)。我想通过阅读你的问题,这是你正在寻找的结果吗?

编辑:SSAS默认行为是在较高级别维度成员上定义的度量为所有维度成员的子级显示相同的值。因此,您的每月1000目标也将在该月的每一天显示为1000。使用计算成员

可以轻松克服这个问题

答案 1 :(得分:1)

简单回答,没有。创建一个单独的月份表(不要打扰雪花)以在第二个数据集市中使用 - 这将使第一个数据集市的日期维度变得简单。此数据集市上的汇总和汇总将像第二个数据集市不存在一样简单。否则使用解决方案2; - )。

BTW我总是喜欢在雪花时保留现有的尺寸。