簡體   English   中英

在OLTP系統中實現行版本控制的DataModel

[英]DataModel for Implementing row versioning in OLTP system

我有下表

  • 人員(PID,名稱,Dob,AddressId) PID是代理密鑰(自動遞增)

  • 地址(地址標識,線1,線2,城市,州)代理鍵的地址標識 (自動遞增)

我的許多交易表中都使用了PersonID(PID)。 由於一個人的地址可能會隨時間變化,因此我需要將記錄版本存儲在數據庫中,以便可以根據時間段引用正確的版本。 我應該如何處理。

我正在考慮解決這樣的問題

  • 使用同一張表存儲歷史記錄,例如
  • 人(PID,姓名,Dob,AddressId)
  • 地址(AddressId,Line1,Line2,城市,州,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate)

如下假設人的初始記錄

Person(100, X, Y, 110)
Address(110, A, B, C, D, 2011-01-01, 9999-12-31, Y, 2011-01-01)

現在,地址在2012年更改為PID100。我正在考慮這樣做

Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - INSERT
Address(110, A, B, Q, D, 2012-06-01, 9999-12-31, Z, 2012-06-01) - UPDATE

如果2014年 PID 100的地址再次更改。

Address(740, A, B, Q, D, 2012-06-01, 2014-06-01, Y, 2012-01-01) - INSERT
Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - NO CHANGE
Address(110, A, B, N, D, 2014-06-01, 9999-12-31, R, 2012-06-01) - UPDATE

現在,我可以查詢歷史數據以及同一表中的當前數據,而無需更改代理鍵。 我將不必引用歷史表,因此不會轟炸邏輯和表。

假設我的地址代碼是唯一的,這種方法不會讓我對表實施唯一的鍵約束。 我該如何處理?

請為此提出不同的方法和反饋。

我要做的是制作一個包含日期的關系表:

Person_At_Address(PID,AddressId,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate)

並從Person和Address產生中刪除相應的列:

Person(PID, Name, Dob)
Address(AddressId, Line1, Line2, City, State)

現在,每當有人更改地址時,您只需在Person_At_Address表中插入新行。 查詢時,您已經獲得了有關歷史數據和當前數據的所有信息。

至於NO-CHANGE行的情況,您有很多選擇可以將其拉出:

  • 如果該時間片沒有行,則可以有一個計划的作業,該作業在給定的檢查點及時插入行。 然后,選擇查詢將為您提供上面的輸出。
  • 您也可以在運行查詢后通過填寫應用程序中缺少的行來創建類似的顯示。 那也很簡單。

暫無
暫無

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

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