渐变维度 (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 的不同场景的主要内容,如果未能解决你的问题,请参考以下文章