渐变维度 (SCD) 类型 2 的不同场景

Posted

技术标签:

【中文标题】渐变维度 (SCD) 类型 2 的不同场景【英文标题】:Different scenarios with Slowly Changing Dimensions (SCD) Type 2 【发布时间】:2015-02-26 09:58:02 【问题描述】:

我们目前在数据仓库中有一个名为“卡片”的表。这被设计为类型 2 的缓慢变化维度;如果卡片状态发生变化,我们会在其中创建一个新记录,以便我们可以跟踪卡片的状态变化。

即使状态没有改变,我们也会每天记录每张卡 - 这样做是为了跟踪每日余额。示例:

cardId     state          balanceAsAt     balance  ....
1          ACTIVE         2014-01-01      100.00
1          ACTIVE         2014-01-02       99.00
1          DELETED        2014-01-03        0.00

如果我需要在今天,2015 年 2 月(例如 2014-01-01)执行过去日期范围(例如 2014 年 1 月 2 日)的 ETL,那么存储数据的最佳方式是什么,假设没有办法检索卡的过去状态?

选项 A - 插入包含过去一天当前数据的记录

cardId     state          balanceAsAt     balance  ....
1          ACTIVE         2014-01-01      100.00
1          DELETED        2014-01-01        0.00   [new entry here? - however now the card seems to have been 're-activated' on the 2nd, which is not the case]
1          ACTIVE         2014-01-02       99.00
1          DELETED        2014-01-03        0.00

选项 B - 不要修改已在维度中创建的记录

cardId     state          balanceAsAt     balance  ....
1          ACTIVE         2014-01-01      100.00
1          ACTIVE         2014-01-02       99.00
1          DELETED        2014-01-03        0.00

还有其他选择/标准做法吗?

【问题讨论】:

我不明白这个问题 - execute past ETL today, Feb 2015 是什么意思?为什么要为 2014-01-01 插入额外的行? 抱歉,我的意思是说我应该在过去的日期范围(例如 2014-01-01)执行 ETL 的选项是什么 - 由于更新了卡状态,我们是否应该包含新记录? 【参考方案1】:

阅读说明后,我意识到您手中可能有一个变化非常快的维度。我的建议是,如果可能,将 balance 属性更改为缓慢变化的维度类型 1(更新),并在事实表中记录余额。为此,您有两个选择:

    快照:每天为每张卡片创建一个条目。例如,如果您需要(经常)知道给定日期(或给定月份)内卡的平均余额是多少,这非常好。 交易记录:一个事实表,您可以在其中跟踪卡上的交易,以及交易前后的余额。这具有在硬盘驱动器中占用更少空间的快照的优点。

您应该注意,对于变化缓慢的属性应该使用缓慢变化的维度,而对于变化非常频繁的属性使用缓慢变化的维度并不是一个好主意。您的卡片尺寸会增长过快;这将带来性能负担。


我的第二个注意事项是您没有正确实施缓慢变化的维度。您既没有实现维度键,也没有实现缓慢变化的维度标志。

正确实现的维度如下所示:

keyCard   cardId         state          startDate       endDate      balance  
1          1          ACTIVE         2014-01-01     2014-01-03   100.00
2          1          ACTIVE         2014-01-03     2014-02-01   99.00
3          1          DELETED        2014-02-01     null          0.00

您可以通过以下方式检索最后一条记录:

  select * from DimensionCards where endDate is null;

【讨论】:

感谢您的回答。是的,当然我只包括了必要的字段。我确实有一个开始和结束日期以及一个标志 cardIsActive,当我拥有该卡的最新版本时,该标志为 TRUE。

以上是关于渐变维度 (SCD) 类型 2 的不同场景的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 SCD 类型 3

如何处理 SCD 类型 2 维度和重复维度记录?

不同色谱柱的不同 SCD 类型

数据仓库类型 2 scd 员工维度和 HR Facts (Kimball's)

如何最好地处理缓慢变化维度 (SCD2) 中的历史数据变化

kettle学习之--缓慢变化维度(SCD)