2014-04-26 38 views
2

我有一個複雜的對象結構,其中描述了產品配置的多級嵌套關係。配置更改超時,我需要能夠在將來的任何時候參考不同的配置。在任何時候,整個系統都與特定版本的產品相關聯,並以某種方式抽象出產品版本的整體概念。帶有多級嵌套關係版本控制的對象

實現此目的最直接的方法是每次請求新版本時克隆產品的整體結構並將不同版本鏈接在一起。然而,這是數據庫負載方面的矯枉過正。有沒有更好的辦法 ?

我也想過要單獨跟蹤更改,並在需要版本時重新構建產品,但似乎相當複雜,需要使用多級嵌套關係才能實現。

或者

保存最小的元數據數據庫來跟蹤一個版本,序列化使用工具的整個產品結構,如GIT。

回答

0

VCS工具不是爲此目的而設計的。這是一個應用程序功能(版本歷史),應該這樣對待。實現此目的的正確方法是爲每個版本化的項目類型創建一個「存檔」表格,並通過ID將它們與當前的「實際」項目相關聯。

然後,無論何時該項目發生變化,請將其當前狀態更新,然後再將該項目的更改提交至主項目表。

最重要的差別要提出的是,這不是存儲版本歷史記錄爲您C#的情況下對象,它是爲你的應用程序存儲的概念終端用戶「項目」的版本歷史記錄的應用程序的功能。 「產品歷史」和「產品對象歷史」不是同一回事;你想實現前者。你的對象狀態和它們實際表示的項目是兩個截然不同的東西。

Git等版本控制工具用於存儲應用程序本身的修訂版,而不是爲應用程序正在使用的數據提供歸檔功能。這屬於數據庫。

或者,如果問題能夠將數據回滾到特定時間點,那麼應該通過獲取數據庫的日期戳快照來實現,因爲這是可以根據需要換出的數據庫,因爲這是完全獨立於應用程序本身。

+0

我同意你的看法,這是一個功能,應該這樣對待。作爲單獨的表/存儲庫的存檔將存儲不同的版本,但是,整個系統應該能夠在任何時候任何用戶選擇時鏈接到特定版本,因此數據庫不能爲了反映特定情況而被交換版。將產品克隆和存儲在同一張表中,可能在某個時候使用分區對我來說似乎是將整個系統從不同產品版本的存在中抽象出來的唯一方法。 – ken

+0

然後,您應該在數據庫內的單個歸檔表中歸檔 - 如果這是用戶可以切換的內容,那麼您需要開始將其視爲應用程序功能,而不是數據庫管理/版本控制任務。使用與主產品鏈接的ProductID跟蹤ProductArchive表中的每個版本。然後編寫代碼按日期/版本號/任何您需要的方式獲取特定版本。 –

+0

如果我使用ProductArchive方式,我需要爲每個相關表(ProductItems,ProductXXX ....)創建一個Archive表)或者每個表需要有一個完全低效的ProductID和ProductArchiveID :( – ken