Rails使用迁移的概念来使用ActiveRecord API处理模型更改。
CouchDB使用JSON(嵌套映射和数组)来表示其模型对象。
到目前为止,在使用CouchDB时,我没有看到识别文档结构何时发生变化的好方法(除了作为开发人员受到纪律处分),或者用于将文档从旧模型迁移到新模型。
是否存在现有功能,或者您是否拥有在CouchDB中处理模型更改的最佳实践?
答案 0 :(得分:9)
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"
}
希望有所帮助。
答案 1 :(得分:3)
查看ActiveCouch。
CouchDB是故意无架构的,因此从ActiveRecord迁移到CouchDB等效项的概念没有一对一的映射。但是,ActiveCouch确实包含了CouchDB“视图”的迁移。
答案 2 :(得分: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)
。