Type 2 缓慢变化维度查询某个时间点的历史数据

Type 2 Slowly Changing Dimensions and Querying for Historical data at a point in time

我有一个小星型模式,表示 Jira 中问题的时间条目。我有一个 IssueAttributes 类型 2 维度 table,然后是一个 TimeEntry 事实 table。

维度的简化视图 table:

+----------+---------+-------------+-----------+-----------+------------+----------+
| IssueKey | IssueID | IssueNumber | IssueName | IsCurrent | ValidFrom  | ValidTo  |
+----------+---------+-------------+-----------+-----------+------------+----------+
| 1        | 123456  | PR-1000     | Original  |  0        | 2000-01-01 |2020-04-09|
+----------+---------+-------------+-----------+-----------+------------+----------+
| 2        | 123456  | PR-1000     | Changed   |  1        | 2020-04-10 |9999-1231 |
+----------+---------+-------------+-----------+-----------+------------+----------+

事实的简化视图 Table:

+--------------+---------+-----------+
| TimeEntryKey | IssueKey| TimeEntry |
+--------------+---------+-----------+
| 11111        | 1       | 1.25      |
+--------------+---------+-----------+
| 11112        | 2       | 1.5       |
+--------------+---------+-----------+

当我插入事实 table 时,我使用的是来自维度 table 的当前 IssueKey,这似乎是正确的方法。但是,如果我想获得时间条目的总和并按 IssueName 对它们进行分组,则会产生 2 行,因为名称在第一行和第二行之间发生了变化。我的印象是最好保持简单连接并使用键,但在这种情况下,您似乎需要先连接到 IssueKey 上的维度,然后再将其连接到维度再次在 IssueNumberIsCurrent = 1 上以获取当前版本数据的属性。我这样做没有问题,但我也理解加入在 DW 中应该很简单,因此最终用户不必仔细考虑这些加入是如何工作的,这似乎与这种理解相矛盾。我在想这个吗?您不应该返回并更新事实 table 中的 FK,对吧?我是否需要一致的维度或其他东西来使某些属性随时间保持一致?

我目前的方法是将体操放在一个视图中,这样最终用户就可以只引用该视图,而不必考虑所有的连接。我是不是想错了?

我认为您的 TimeEntry 事实是交易事实 table。我建议你添加以下列

  • 行当前标志
  • 开始日期(或 'start date time' 如果您一天中有多个更新)
  • 结束日期(或 'end date time' 如果您一天中有多个更新)

现在当你进行聚合时,你只需要查看事实中的当前行table;您的最新行也只会查看您已经实施的最新暗淡行。如果源系统发生变化,您也不必去更新历史记录。您可能需要停用旧行并添加一个包含最新属性键的新行。

这可能会解决您的问题。