2008-09-24 131 views
8

Rails使用ActiveRecord API使用遷移的概念來處理模型更改。CouchDB文檔模型更改?

CouchDB使用JSON(嵌套地圖和數組)來表示其模型對象。

到目前爲止,在處理CouchDB時,我沒有看到識別文檔結構何時發生變化(除了作爲開發人員受到處罰)或者將文檔從舊模型遷移到新模型的好方法。

有沒有現有的功能,或者您有處理CouchDB模型更改的最佳實踐?

回答

9

RDBMS去洗腦的時間。 :)

couchdb的無模式設計最大的一點直接是爲了防止遷移的需要。對象的JSON表示可以讓您輕鬆地輸入對象的類型。

例如,假設您有博客類型的Web應用程序,其中包含帖子以及人們在博客中存儲的任何奇特的內容。你的帖子文檔有作者,標題,創建等領域。現在你來一起自我思考,「我應該追蹤月亮在我發佈帖子時的階段......」,你可以開始添加moon_phase作爲新帖子的屬性。

如果你想完成,你會回去並將moon_phase添加到舊帖子,但這不是必須的。

在您的觀點中,您可以訪問moon_phase作爲屬性。它會爲空或導致異常或什麼。 (不是JS專家,我認爲null是正確答案)

事情是,它並不重要。如果你想改變一些東西,只需改變它。儘管確保你的觀點了解這一變化。根據我的經驗,這並不需要太多。

此外,如果你真的偏執,你可以存儲一個版本/類型的屬性,如:

{ 
    _id: "foo-post", 
    _rev: "23490AD", 
    type: "post", 
    typevers: 0, 
    moon_phase: "full" 
} 

希望有所幫助。

3

退房ActiveCouch:http://code.google.com/p/activecouch/

CouchDB的是無模式的有目的的,所以沒有從ActiveRecord的遷移到CouchDB的等效概念的1對1映射。但是,ActiveCouch確實包含了對CouchDB「視圖」的遷移。

+1

看起來像activecouch現在在GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan 2009-02-20 08:19:05

3

如果您擁有架構並仍希望使用CouchDB,則會出現「阻抗不匹配」。

儘管如此,「遷徙」並不難。爲每個文檔添加一個schema_version元素。然後讓你的「文件閱讀功能」包括更新。事情是這樣的:

def read(doc_id): 
    doc = db.get(doc_id) 
    if doc.schema_version == 1: 
     # version 1 had names broken down too much 
     doc.name = "%s %s" % (doc.first, doc.last) 
     del doc.first 
     del doc.last 
     doc.schema_version = 2 
     db.put(doc) 
    if doc.schema_version == 2: weight 
     # version 2 used kg instead of g 
     doc.weight_g = doc.weight_kg * 1000 
     del doc.volume_kg 
     doc.schema_version = 3 
     db.put(doc) 
    return doc 

如果你想提升整個DB立刻就叫read(doc_id)給每個文檔。