2011-08-02 80 views
2

我實現了我自己的域模型的版本控制(在更新操作期間跟蹤對象的差異)。領域模型具有樹形結構。例如。 (- >是參考)域模型的版本控制

A 
|-> B 
|-> C -> A 
    | -> C 

爲版本控制需求以下:

  • 獲取該組域對象的兩個版本之間的改變的字段;
  • 域模型具有樹形結構;
  • 字段可以在列表中組織。在下面的示例性系統應該顯示Y元素中除去(但除去不是Z和Y改變其狀態上Z)和X變爲:

     [ v1 ]    [ v2 ] 
     A     A 
     |-> [X, Y, Z]  |-> [X, Z] 
      |-> C    |-> M 
  • 有喜歡鎖定沒有更多的要求/合併/分支。

我調查了在同一個對象的兩個狀態之間獲取變更集的方式。我與Java一起工作,並對現有的方法/解決方案感興趣。例如。我在尋找subversion用來創建下一個版本的算法的描述。

我很樂意從您那邊得到任何理論或實踐建議。

感謝

回答

0

嗯,我會說,你在這裏講2個不同的東西。

Subversion有一個完整樹的修訂版本號,意思是每個更改都是以前版本的便宜副本。因此,在對象層次結構中沒有變化。它更多的是總結所有的變化 - 並且它們是通過您通常的差異機制爲每個文件計算的。

如果您需要對持久化對象進行版本控制,那麼我會在每個版本中添加一個版本屬性,然後在每個類中添加一個計算差異的方法。但是,也許你需要告訴我們你打算如何使用這些信息?

+0

添加了更多特定要求。 – Raman

+0

我無法幫助您瞭解顛覆算法的內部,但我仍然認爲我的方法是有效的,讓您的每個類都負責檢測內部的更改並將其傳播到根對象。對我而言,它尚未闡明你想要對變更集做什麼,只是將其打印出來或以某種方式處理它? –

+0

是的,只是打印更改集就足夠了。對於我來說,如何比較列表中的重新排序有一個問題 - 似乎裏面的每個元素都應該有一個id。 – Raman

1

我懷疑你的領域模型不使用文本文件表示,但作爲一個對象模型在關係數據庫中最有可能持續。目前我們正在設計這款產品,並且已經進行了原型設計。

我的經驗教訓:

  1. 你需要什麼功能,你需要進行版本控制,哪些是你並不需要一個精確的描述。只需記錄更改很容易,提供帶有獨佔鎖定的標籤版本和分支很難,因爲合併非常困難。
  2. 可以使用觸發器在db級別實現日誌記錄。爲所有域對象創建表,並且如果條目被添加/編輯/刪除,則記錄完整條目。根據需要附加信息(時間...)。可能需要每個用戶都以自己的db用戶身份登錄到數據庫,以便您可以查詢CURRENT_USER以記錄他。
  3. 除了更改編輯之前/之後的日誌記錄,您可以記錄屬性的修改。但是這會創建更多的日誌條目,並且收集特定提交的所有更改的成本很高。
  4. 鎖定對象可以使用方法調用(鎖定/解鎖)完成。檢查鎖可以在數據庫級別使用觸發器再次完成(獲取CURRENT_USER並檢查他是否鎖定了對象)。這具有如下優點:用戶代碼不必查詢對象是否被鎖定,但數據庫將阻止插入/編輯/刪除。不使用鎖定將需要您實施合併。這將會非常困難,因爲您不使用文本文件,而是使用高度結構化的數據。
  5. 將版本與您的域模型結合可能會令人驚訝地棘手。特別是如果您需要不泄漏版本到您的域模型(如果您打算重新使用版本控制系統)。原型吧!