类型2 渐变维度和查询某个时间点的历史数据
Posted
技术标签:
【中文标题】类型2 渐变维度和查询某个时间点的历史数据【英文标题】:Type 2 Slowly Changing Dimensions and Querying for Historical data at a point in time 【发布时间】:2020-04-10 15:04:21 【问题描述】:我有一个小星型模式,表示 Jira 中问题的时间条目。我有一个 IssueAttributes 类型的 2 维表,然后是一个 TimeEntry 事实表。
维表简图:
+----------+---------+-------------+-----------+-----------+------------+----------+
| 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 |
+----------+---------+-------------+-----------+-----------+------------+----------+
事实表的简化视图:
+--------------+---------+-----------+
| TimeEntryKey | IssueKey| TimeEntry |
+--------------+---------+-----------+
| 11111 | 1 | 1.25 |
+--------------+---------+-----------+
| 11112 | 2 | 1.5 |
+--------------+---------+-----------+
当我插入事实表时,我使用的是维度表中的当前IssueKey
,这似乎是正确的方法。但是,如果我想获得时间条目的总和并按IssueName
对它们进行分组,则会产生 2 行,因为名称在第一行和第二行之间发生了变化。我的印象是最好保持简单的连接并使用键,但在这种情况下,您似乎需要先在IssueKey
上加入维度,然后再将其加入维度IssueNumber
和 IsCurrent = 1
以获取当前版本数据的属性。我这样做没有问题,但我也理解在 DW 中连接应该很简单,因此最终用户不必考虑这些连接是如何工作的,这似乎与这种理解相矛盾。我是否正确地考虑了这一点?您不应该返回并更新事实表中的 FK,对吗?我是否需要一致的维度或其他东西来保持某些属性随着时间的推移保持一致?
我目前的方法是将体操放在一个视图中,这样最终用户就可以只引用该视图,而不必考虑所有的连接。我是不是想错了?
【问题讨论】:
Hi Hyphen 您的事实表是否维护历史记录? @NITHINB 我的事实记录在插入时插入了维度记录当前版本的密钥,然后我不再更新该事实记录。因此,在我的示例中,TimeEntryKey 11111 的事实记录永远不会更新以反映 IssueKey 2。 【参考方案1】:我认为您的 TimeEntry 事实是一个事务性事实表。我建议你添加以下列
行当前标志 开始日期(或“开始日期时间”,如果您在一天中有多个更新) 结束日期(或“结束日期时间”,如果您在一天中有多个更新)现在,当您进行聚合时,您只需要查看事实表中的当前行;您的最新行也只会查看您已经实施的最新暗淡行。如果源系统发生变化,您也不必去更新历史记录。您可能需要淘汰旧行并添加带有最新属性键的新行。
这可能会解决您的问题。
【讨论】:
我曾考虑过这样做,但拥有 2 类事实表似乎并不常见,所以我自己猜测。我没有任何其他想法,类型 2 事实表似乎可以解决问题,所以我想我会采用这种方法。以上是关于类型2 渐变维度和查询某个时间点的历史数据的主要内容,如果未能解决你的问题,请参考以下文章