Rails使用ActiveRecord API使用遷移的概念來處理模型更改。CouchDB文檔模型更改?
CouchDB使用JSON(嵌套地圖和數組)來表示其模型對象。
到目前爲止,在處理CouchDB時,我沒有看到識別文檔結構何時發生變化(除了作爲開發人員受到處罰)或者將文檔從舊模型遷移到新模型的好方法。
有沒有現有的功能,或者您有處理CouchDB模型更改的最佳實踐?
Rails使用ActiveRecord API使用遷移的概念來處理模型更改。CouchDB文檔模型更改?
CouchDB使用JSON(嵌套地圖和數組)來表示其模型對象。
到目前爲止,在處理CouchDB時,我沒有看到識別文檔結構何時發生變化(除了作爲開發人員受到處罰)或者將文檔從舊模型遷移到新模型的好方法。
有沒有現有的功能,或者您有處理CouchDB模型更改的最佳實踐?
RDBMS去洗腦的時間。 :)
couchdb的無模式設計最大的一點直接是爲了防止遷移的需要。對象的JSON表示可以讓您輕鬆地輸入對象的類型。
例如,假設您有博客類型的Web應用程序,其中包含帖子以及人們在博客中存儲的任何奇特的內容。你的帖子文檔有作者,標題,創建等領域。現在你來一起自我思考,「我應該追蹤月亮在我發佈帖子時的階段......」,你可以開始添加moon_phase作爲新帖子的屬性。
如果你想完成,你會回去並將moon_phase添加到舊帖子,但這不是必須的。
在您的觀點中,您可以訪問moon_phase作爲屬性。它會爲空或導致異常或什麼。 (不是JS專家,我認爲null是正確答案)
事情是,它並不重要。如果你想改變一些東西,只需改變它。儘管確保你的觀點了解這一變化。根據我的經驗,這並不需要太多。
此外,如果你真的偏執,你可以存儲一個版本/類型的屬性,如:
{
_id: "foo-post",
_rev: "23490AD",
type: "post",
typevers: 0,
moon_phase: "full"
}
希望有所幫助。
退房ActiveCouch:http://code.google.com/p/activecouch/
CouchDB的是無模式的有目的的,所以沒有從ActiveRecord的遷移到CouchDB的等效概念的1對1映射。但是,ActiveCouch確實包含了對CouchDB「視圖」的遷移。
如果您擁有架構並仍希望使用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)
給每個文檔。
看起來像activecouch現在在GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan 2009-02-20 08:19:05