代码之家  ›  专栏  ›  技术社区  ›  Kyle Burton

文档模型是否可以更改?

  •  8
  • Kyle Burton  · 技术社区  · 16 年前

    Rails使用迁移的概念来处理使用ActiveRecord API进行的模型更改。

    CouchDB使用JSON(嵌套的映射和数组)来表示其模型对象。

    到目前为止,在使用CouchDB时,我看不到很好的方法来识别文档的结构何时发生了变化(除了作为开发人员受到约束),或者用于将文档从旧模型迁移到新模型。

    在CouchDB中,是否有现有的特性或处理模型更改的最佳实践?

    3 回复  |  直到 6 年前
        1
  •  9
  •   Paul J. Davis    16 年前

    RDBMS去洗脑的时间到了。:)

    CouchDB无模式设计的最大特点之一就是直接防止迁移的需要。对象的JSON表示形式使您可以很容易地直接跳过类型的对象。

    例如,假设你有一个博客类型的web应用程序,上面有文章和人们在博客中存储的任何花哨的东西。你的文章文档中有作者、标题、创建时间等字段。现在你自己想想,“当我发布文章时,我应该跟踪月亮处于哪个阶段……”你可以开始添加月亮阶段作为新文章的属性。

    如果你想完成任务,你可以回去把月亮相位添加到旧的帖子里,但这并不是绝对必要的。

    在您的视图中,您可以访问月球阶段作为属性。它将是空的,或者导致异常或其他。(不是JS专家,我认为空是正确的答案)

    事实上,这并不重要。如果你想改变什么,就改变它。但要确保你的观点理解这种变化。根据我的经验,这并不需要太多。

    另外,如果你真的是偏执狂,你可能会存储一个版本/类型属性,如:

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

    希望有帮助。

        2
  •  3
  •   James A. Rosen    16 年前

    如果你喜欢有模式并且仍然想使用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
    

    如果您想一次升级整个数据库,只需调用 read(doc_id) 对于每个文档。

        3
  •  3
  •   ndequeker Idan Wender    6 年前

    退房 ActiveCouch .

    couchdb是一种无目的的模式,因此没有从activeRecord迁移到couchdb等价物的概念的1对1映射。但是,ActiveCouch确实包括对CouchDB的“视图”的迁移。