作为一名建模者,试图找出在 SCD 类型 2 表中处理删除的最佳方法是什么。
根据原则,SCD 类型 2 表使用 START_DT 和 END_DT 等 ETL 日期来跟踪更改。
- START_DT 将是记录生效的日期。
- END_DT 将是它更改为另一种形式的日期或 Null/High Date 以表示当前版本的记录。
- 在所有时间点,对于键组合,都会有一个当前版本记录,其 END_DT 为空日期或高日期。
现在,如果从源中删除记录,下面的最佳选择是什么,
- 如果从源中删除记录,则有额外的列,如 SRC_DELETE_IND,默认设置为“N”和“Y”。
Ex: Record came on 1st Oct
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 Null ABC N
Record had an update on 2nd Oct
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 2021-10-02 ABC N
1 2021-10-02 Null XYZ N
Record got deleted on 3rd Oct
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 2021-10-02 ABC N
1 2021-10-02 Null XYZ Y
- 与 1 相同,但在 Delete Came 时插入新的重复行。
Record got deleted on 3rd Oct
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 2021-10-02 ABC N
1 2021-10-02 2021-10-03 XYZ N
1 2021-10-03 Null XYZ Y
- 而不是 SRC_DELETE_IND 记录的过期/结束日期
Record got deleted on 3rd Oct
PK_ID START_DT END_DT VALUE
1 2021-10-01 2021-10-02 ABC
1 2021-10-02 2021-10-03 XYZ
但是这里我们现在没有打开记录了。
如果记录重新出现在 Source 中并声明为不正确删除,则会增加复杂性。让我们在 10 日说,对于选项 1,数据看起来像,
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 2021-10-02 ABC N
1 2021-10-02 Null XYZ N --Reversed
对于选项 2
PK_ID START_DT END_DT VALUE SRC_DELETE_IND
1 2021-10-01 2021-10-02 ABC N
1 2021-10-02 2021-10-03 XYZ N
1 2021-10-03 Null XYZ N -- Reversed but now row is duplicate
对于选项 3
PK_ID START_DT END_DT VALUE
1 2021-10-01 2021-10-02 ABC
1 2021-10-02 2021-10-03 XYZ
1 2021-10-10 Null XYZ --considered as New since no open record existed. Creates ETL gap
哪个选项更有意义,并且符合 DWH 最佳实践。