7

我發現RCS for models是一個在數據持久性環境中解決的有趣問題。他們是使用django ORM來實現這個django-reversionAuditTrail的幾個解決方案,每個解決方案都提出了自己的方法來完成它。如何在您的首選db範例中爲您的模型實施修訂控制系統?

這裏是我想有修正模型(在Django模型類格式):

class Page(Model): 

    title = CharField() 
    content = TextField() 
    tags = ManyToMany(Tag) 
    authors = ManyToMany(Author) 
  • 每個版本應該以日期被註釋,一個版本號評論用戶做了修改。

你會如何在你首選db(Mongo,neo4j,CouchDb,GAE Datastore)?

請僅發佈每個帖子的RCS模型的一個示例。

我不是要求一個完整的代碼(也許一個解釋就夠了?),但足以看到如何解決這個問題在每個數據庫類型。

+0

你能更具體嗎? – 2010-01-07 21:39:33

回答

0

在CouchDB中,這非常簡單。數據庫中的每個項目都有一個_id和一個_rev。所以你不需要一個單獨的版本號。那麼我可能會這樣做。爲每個項目分配一個systemrev編號。這個數字將是另一個數據庫記錄的鏈接,其中包含該修訂的日期,評論和用戶。

例子:

項目正在跟蹤:

{ 
    _id: "1231223klkj123", 
    _rev: "4-1231223klkj123", 
    systemRev: "192hjk8fhkj123", 
    foo: "bar", 
    fooarray: ["bar1", "bar2", bar3"] 
} 

,然後創建一個單獨的版本記錄:

{ 
    _id: "192hjk8fhkj123", 
    _rev: "2-192hjk8fhkj123", 
    user: "John", 
    comment: "What I did yesterday", 
    date: "1/1/2010", 
    tags: ["C# edits", "bug fixes"] 
} 

對我來說似乎很優雅....

2

首先,如果您使用的是CouchDB,請不要使用_rev字段。

爲什麼?壓縮數據庫時舊版本會丟失。

壓實重寫數據庫文件, 刪除過時的文件修訂 和刪除文件。

CouchDB wiki - Compaction page

有幾個可能的解決方案:

  1. 保持當前和老版本在同一個數據庫。添加額外的修訂字段以確定當前版本和舊版本之間的差異。
  2. 將舊版本存儲在單獨的數據庫中。當新版本添加到「當前」數據庫時,舊版本文檔可以被刪除並插入到「版本」數據庫中。

哪一個最好?這取決於你的數據將如何被訪問。如果您可以獨立於當前版本查詢舊版本,那麼將該文檔存儲在兩個不同的數據庫中將爲您帶來一些性能優勢。

相關問題