Sql-Server
歷史表實現:“元組版本控制”與生效日期
我正在設計一個具有歷史表(我猜是 SCD 類型 4)的數據庫,用於審計目的。
問題是元組版本控制(開始日期和結束日期)與僅生效日期相比有什麼優勢?
- 元組版本控制
CREATE TABLE HistoryTable ( Column1 Type1, : : Columnn Typen, StartDate DATETIME, EndDate DATETIME )
- 生效日期
CREATE TABLE HistoryTable ( Column1 Type1, : : Columnn Typen, EffectiveDate DATETIME )
對於(1)到目前為止我看到了缺點 - 我必須更新
$$ end date $$在插入新的/目前的歷史記錄時。 對於(2)我只能插入新記錄而不搜尋和修改之前的記錄。
從查詢的角度來看,這兩種方法看起來都差不多。
我知道 SQL Server 2016 有臨時表,但到目前為止我們還不能使用它。
元組版本控制
- 每條新數據都需要兩次更新 - 一次用於設置舊行的結束日期,一次用於插入新行。
- 索引很可能包含間隔日期,使它們更寬且效率略低。
- 歷史查詢(AS OF < date >)更簡單。
- DELETE 可以是邏輯刪除,無需更多程式碼。
- 活動行的末尾必須標有“神奇”值,通常為 9999-12-31 或 NULL。後者會使程式碼複雜化。前者經常演變成幾個難以處理的魔法值。
生效日期
- 每次讀取都需要 MAX()、TOP(1) 或類似功能。
- 將單個 DATE 列添加到索引將導致一點點膨脹。
- 如果不向表中添加佔位符“已過期”行,則無法進行邏輯刪除。
對彼此而言
- 所有寫入都是插入,從不更新。
- 主鍵擴展為包括日期,對引用表有影響。
- 最好使用 UTC 作為生效日期以避免時區和 DST 問題。
我都試過了。元組版本控制總體上更容易支持。
使用觸發器重現 SQL Server 時態表的功能相對簡單。擁有一個單獨的歷史表消除了由於將歷史和實時值混合在一個表中而產生的許多複雜性。