2008-09-24 98 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)给每个文档。