2009-08-26 103 views
21

請問以下是用於實現版本控制的可行策略(使用「榜樣」爲樣本文檔類型):CouchDB的版本管理策略

具有其中類型字段example_original一個名爲原始文檔。

對文檔的後續更改都將類型example_change和example_original文檔的id作爲關鍵字。更改也會帶有時間戳。

保留一個類型爲example_current的doc,它是example_original的結果,其中所有example_change均爲「applied」。新的example_change文檔將自動應用於此文檔。

找到一個特定的版本將包括檢索example_original文檔並應用所需的更改(通常達到某個時間戳,但也可能是一些更改)。

我應該提到我的用例會涉及對原始數量進行的有限數量的更改。大多數更新將包含新的原始文檔。雖然這是我目前的用例,但如果涉及許多更改,我也會對這些問題感興趣。

你在這種方法中看到什麼優點和缺點?

+0

您是否試圖版本文檔內容或文檔結構? – Dokie 2009-08-26 11:14:38

+0

僅限內容。永遠不會刪除字段,只會添加。 – mac 2009-08-26 11:46:02

回答

9

我的第一個擔心是:當「獲取」某個版本時,是否可以在不修改數據庫的情況下將更改應用到原始文件?

您是否需要從歷史記錄中刪除某些內容?你確定嗎?真的,真的嗎?如何分支機構?

總而言之,這看起來像一個複雜的戰略。請記住,我聽說過CouchDB,但從未使用它。我想去更簡單的方法:

  1. 當您創建一個文檔時,您分配一個UUID。不要使用該名稱,否則在重命名操作過程中會遇到麻煩。添加一個讀取「1」的版本字段。創建第二個文檔,其中包含具有相同UUID的文檔列表,或向第一個文檔添加「父」指針。

    爲每個文檔創建一個「歷史文檔」可以更快地導航歷史記錄,但父指針更「安全」(因爲您無法輕鬆地使用它們創建非法結構)。

  2. 當您創建新修訂版時,請重新使用UUID並指定一個新的唯一版本。更新歷史文檔或父指針。

這個策略實現起來相當簡單,並允許以後各種靈活性。您可以輕鬆擦除歷史的一部分,重命名很簡單,並且您可以創建分支。

+0

看到你的觀點,謝謝你的建議。我永遠不需要從歷史記錄中刪除某些內容,但有些更改可能會標記爲「錯誤」或類似內容。不需要支持分支。 – mac 2009-08-26 11:49:11

1

這些文件的商業狀態是什麼,尤其是合法的?由於需要證明作爲v.3提供的文檔確實是文檔的第3版,所以我曾經在您的建議不適合業務持續性的情況下工作。動態應用三角洲不會削減順應性芥末。

如果您像文中所說的那樣對文件進行頻繁更改,那麼您將不會通過存儲增量而是整個文檔來節省大量磁盤空間。存儲整個文檔還可以可靠地預測任何文檔的檢索時間。它還降低了檢索過程的複雜性。

+0

我不認爲這會代表合規性問題,只要您擁有所有文檔(包括更改文檔)的審覈日誌。這種方法類似於原始合同和後續修正案的方法。 – mac 2009-08-26 11:54:59

1

使用CouchDB進行版本控制的策略是不要壓縮包含需要保留完整歷史記錄的文檔的數據庫。您仍然可以壓縮其他數據庫。採用編輯衝突解決策略,這種簡單的策略即刻起作用。

刪除文檔可以通過編寫沒有內容但刪除屬性集的新版本來完成。

分支無法這樣做,因爲版本控制機制提供了單個修訂版本的線程。

現在對於CouchDB的可能的未來:

  • 今天,每個版本保存文檔的完整副本,但人們可以認爲,CouchDB的引擎優化有朝一日商店增量。
  • 未來,CouchDB可能會提供一個API來防止壓縮某些文檔類型。這將允許將所有文檔保存在同一個數據庫中。這對於CouchDB來說是一個簡單的補丁。
  • 該策略確實可以對文檔分支進行管理,但考慮到CouchDB作爲文檔數據庫的性質,這是一種合理而長期的可能性。
+0

一個有趣的想法,但不是很好的建議。雖然您可以通過簡單地避免壓縮來實現一個非常簡單的版本控制系統,但是您可以針對數據庫而不是使用它。最好將每個版本保存爲不同的_id,以便數據庫知道它必須保存。 – 2013-03-15 03:29:07

+0

@NickPerkins,我已經特別提到了不壓縮「該」數據庫..這意味着你可能有一個或多個其他數據庫,你仍然會壓縮。因此,該解決方案不適用於數據庫。 – 2013-03-15 09:41:48

19

Simple Document Versioning with CouchDB

作爲附件這篇文章應該適合版本大多數人的要求,在方法上描述的版本。

+2

鏈接已不再存在,但是[this one](http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB %22%5D)包含描述的4種方法的概述 – 2013-06-05 11:01:09

+0

我相信這是一個更新的[鏈接](https://blog.couchbase.com/how-implement-document-versioning-couchbase) – 2014-03-06 15:37:57

+0

@BrianPutt:鏈接你給正在談論CouchBase,這是從CouchDB不同於CouchDB http://www.couchbase.com/couchbase-vs-couchdb – 2014-03-07 17:25:59