SCD タイプ 2 テーブルで削除を処理する最善の方法を見つけようとしているモデラーとして。
原則として、SCD タイプ 2 テーブルは、START_DT や END_DT などの ETL 日付を使用して変更を追跡します。
- START_DT は、レコードが有効になる日付になります。
- END_DT は、別のフォームに変更された日付、または記録の現在のバージョンを示す Null/High Date になります。
- どの時点でも、キーの組み合わせには、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
しかし、ここでは Open レコードが残っていません。
ソースにレコードが再表示され、誤った削除として示される場合、複雑さが増します。オプション 1 の 10 日に、データは次のようになります。
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 のベスト プラクティスに従っています。