我们目前在数据仓库中有一个名为' Cards'的表。这被设计为类型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
如果我需要执行过去日期范围(例如2014年1月2日),2015年2月(2014-01-01的示例)的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
任何其他选项/标准做法?
答案 0 :(得分: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;