Data-Versioning

目錄版本控制

  • August 10, 2015

如果這不是正確的 SE 網站,我們深表歉意。

我正在設計一個目錄管理應用程序。層次結構中的任何元素都必須進行版本控制,即當我更改它的屬性時,會創建一個新版本。新版本也可以有與以前不同的孩子。使用者在管理目錄時可以在版本之間切換,所以我需要列出一個孩子的所有現有版本。切換版本時,所有後代都會更新)。

我的第一個想法是

| A            |  | B            |  | C            |
|--------------|  |--------------|  |--------------|
| ID  (k)      |  | ID  (k)      |  | ID  (k)      |
| VER (k)      |  | VER (k)      |  | VER (k)      |
| ...          |  | A_ID (fk)    |  | B_ID (fk)    |
|              |  | A_VER (fk)   |  | B_VER (fk)   |
|--------------|  | ...          |  | ...          |
                 |--------------|  |--------------|

實體的鍵總是類似於 (ID, VER) 而父級的 fk 是 (P_ID, P_VER)。

這是實現它的好方法嗎?

更新:顯然比這更複雜。版本控制的意思是元素有有效期,我們需要保留舊版本。例如,客戶以價格 x 購買產品。1 月 1 日之後,它將花費 y。1 月 1 日之後的新客戶獲得新價格 y,但老客戶繼續支付 x。

添加時間戳列可能是這裡的最佳選擇。

老實說,您的要求聽起來像是噩夢和版本控制系統之間的交叉。我強烈建議您查看流行的解決方案,例如Git ,而不是使用關係數據庫重新實現DVCS 。您的應用程序可以有效地成為 Git 的一個很好的皮膚。 **如果您必須通過關係數據庫執行此操作,**那麼我認為通過時間戳進行版本控制將是您成功的最佳機會。

基本策略是在每個實體上放置一個時間戳。然後,當您需要轉到最新版本時,您可以通過關係鏈選擇所有具有最新時間戳的實體。當您需要獲取特定版本時,您可以獲取所有最新版本的實體,這些版本等於或早於您想要的版本時間戳。

按時間戳進行版本控制可防止您將所有舊實體複製到新版本 ID,即使這些實體沒有更改。它還可以讓您避免跟踪這些版本 ID 的麻煩。

這可能會導致查詢時間變慢,但您可以使用它來查看它是否適合您的需求。重申一下,我不認為關係數據庫是最好的解決方案,但有時生活會迫使我們將方釘放在圓孔中。如果這是你一生的命運,我祝你一切順利。

**編輯:**版本控制與歷史定價有關

我同意時間戳是要走的路,因為版本控制與歷史定價有關。要處理這個問題,您只需要一個有效開始日期列。要找到任何時間點的匯率,您只需要找到不在未來的最近日期即可。例如:

declare @Date DATE = SYSUTCDATETIME(); -- Or any other date for historical/future data
;with [CurrentPrice_CTE] AS -- You don't really need this semi-colon but I added it as a defensive habit.
(
   select
     [PriceId] -- Price table's PK
     max([EffectiveStartDate]) AS [EffectiveStartDate]
   from [dbo].[Price]
   where
     [EffectiveStartDate] <= @Date
)
select
 [p].* -- Select the columns you need
from [dbo].[prices] [p]
   inner join [CurrentPrice_CTE] [cp] as [cp].[PriceId] = [p].[PriceId] and [cp].[EffectiveStartDate] = [p].[EffectiveStartDate]

只需確保您為每個產品設置唯一的開始日期,否則該程式碼將返回比您想要的更多的結果。老實說,這聽起來比每次更新都必須還原整個數據庫要簡單得多。:)

引用自:https://dba.stackexchange.com/questions/109397