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

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

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

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

有帮助吗?

解决方案

RDBMS去脑洗脑的时间。 :)

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

例如,假设您有一个博客类型的Web应用程序,其中包含帖子以及人们在博客中存储的任何奇特内容。你的帖子文档有像作者,标题,创建的等字段。现在你来自己想一想,“我应该跟踪我发布帖子时月亮的相位......”你可以开始将moon_phase添加为新帖子的属性。

如果你想完成,你会回去并将moon_phase添加到旧帖子中,但这并非绝对必要。

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

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

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

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

希望有所帮助。

其他提示

如果您正在使用模式但仍想使用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)

查看 ActiveCouch

CouchDB是故意无架构的,因此从ActiveRecord迁移到CouchDB等效项的概念没有一对一的映射。但是,ActiveCouch确实包含了CouchDB“视图”的迁移。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top