簡體   English   中英

處理 SCD 類型 2 中的刪除

[英]Handling Deletes in SCD Type 2

作為試圖找出處理 SCD 類型 2 表中刪除的最佳方法的建模者。

根據原則,SCD 類型 2 表將使用 ETL 日期(如 START_DT 和 END_DT)跟蹤更改。

  1. START_DT 將是記錄生效的日期。
  2. END_DT 將是它更改為另一種形式的日期或空/高日期以表示記錄的當前版本。
  3. 在所有時間點,對於鍵組合,都會有一個帶有 END_DT 的當前版本記錄,要么是空要么是高日期。

現在,如果從 Source 中刪除了一條記錄,那么下面的最佳選擇是什么,

  1. 有像 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. 與 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
  1. 而不是 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   

但在這里我們現在沒有一個開放記錄了。

如果記錄重新出現在源中並聲明為不正確的刪除,則會增加復雜性。 讓我們說 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 最佳實踐。

我會采用更簡單的方法,為已刪除的記錄設置默認的 END_DATE ,例如 1000-12-31 :

PK_ID START_DT    END_DT     VALUE 
1     2021-10-01  2021-10-02  ABC   
1     2021-10-02  1000-12-31  XYZ --> this row is deleted

此外,避免使用 NULL 值。 NULL 值表示缺少值,這與零值不同。 SQL NULL 是一種狀態,而不是值。 這種用法與大多數編程語言完全不同,在大多數編程語言中,引用的空值意味着它不指向任何對象。

我建議您使用 END_DT 的默認日期,例如 9999-12-31,因此在插入一行時,您的維度將如下所示:

 PK_ID START_DT    END_DT     VALUE 
 1     2021-10-01  9999-12-31  ABC 

代替 :

PK_ID START_DT    END_DT     VALUE 
1     2021-10-01  NULL       ABC 

我建議您為維度添加代理鍵。 維度表設計為一列作為唯一的主鍵。 此主鍵不能是操作系統的自然鍵,因為隨着時間的推移跟蹤更改時,該自然鍵將有多個維度行。 此外,一個維度的自然鍵可能由多個源系統創建,並且這些自然鍵可能不兼容或管理不善。 DW/BI系統需要聲明對所有維度的主鍵的控制權; 您應該為每個維度創建匿名整數主鍵,而不是使用顯式自然鍵或帶有附加日期的自然鍵。 這些維度代理鍵是簡單的整數,按順序分配,從值 1 開始,每次需要一個新鍵時。 日期維度免於代理鍵規則; 這個高度可預測和穩定的維度可以使用更有意義的主鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM