具有缓慢变化尺寸(SCD)类型2的不同场景

时间:2015-02-26 09:58:02

标签: sql etl data-warehouse business-intelligence dimensional-modeling

我们目前在数据仓库中有一个名为' 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

任何其他选项/标准做法?

1 个答案:

答案 0 :(得分:1)

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

  1. 快照:为每一天创建一个条目。例如,如果您需要(经常)知道某一天(或某个月内)卡的平均余额余额,这是非常好的。
  2. 事务记录:一个事实表,用于跟踪卡上的事务以及事务之前和之后的余额。这具有快照的优点,即在硬盘驱动器中占用较少的空间。
  3. 您应该知道,对于变化缓慢的属性,应使用缓慢变化的维度,并且对于经常更改的属性使用缓慢变化的维度不是一个好主意。你的卡片尺寸会变得太快;这将带来性能负担。


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

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

    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;