8

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

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

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

在 CouchDB 中是否有现有功能或者您有处理模型更改的最佳实践?

4

3 回答 3

9

RDBMS 去洗脑的时间。:)

couchdb 无模式设计的最大要点之一就是直接针对防止迁移的需要。对象的 JSON 表示可以很容易地直接输入您的对象。

例如,假设您有一个博客类型的网络应用程序,其中包含帖子以及人们在博客中存储的任何花哨的东西。您的帖子文档包含作者、标题、创建时间等字段。现在您来思考一下,“我应该在发布帖子时跟踪月亮处于什么相位......”您可以开始添加 moon_phase 为新帖子的属性。

如果您想完整,您会返回并将 moon_phase 添加到旧帖子中,但这并不是绝对必要的。

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

问题是,这并不重要。如果你想改变一些东西,就改变它。虽然要确保你的观点理解这种变化。根据我的经验,这并不需要太多。

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

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

希望有帮助。

于 2008-09-26T18:19:22.380 回答
3

查看ActiveCouch

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

于 2008-09-24T23:32:52.387 回答
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

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

于 2009-01-04T11:07:07.973 回答