目錄版本控制
如果這不是正確的 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]
只需確保您為每個產品設置唯一的開始日期,否則該程式碼將返回比您想要的更多的結果。老實說,這聽起來比每次更新都必須還原整個數據庫要簡單得多。:)