Rails使用ActiveRecord API使用迁移的概念来处理模型更改。CouchDB文档模型更改?
CouchDB使用JSON(嵌套地图和数组)来表示其模型对象。
到目前为止,在处理CouchDB时,我没有看到识别文档结构何时发生变化(除了作为开发人员受到处罚)或者将文档从旧模型迁移到新模型的好方法。
有没有现有的功能,或者您有处理CouchDB模型更改的最佳实践?
Rails使用ActiveRecord API使用迁移的概念来处理模型更改。CouchDB文档模型更改?
CouchDB使用JSON(嵌套地图和数组)来表示其模型对象。
到目前为止,在处理CouchDB时,我没有看到识别文档结构何时发生变化(除了作为开发人员受到处罚)或者将文档从旧模型迁移到新模型的好方法。
有没有现有的功能,或者您有处理CouchDB模型更改的最佳实践?
RDBMS去洗脑的时间。 :)
couchdb的无模式设计最大的一点直接是为了防止迁移的需要。对象的JSON表示可以让您轻松地输入对象的类型。
例如,假设您有博客类型的Web应用程序,其中包含帖子以及人们在博客中存储的任何奇特的内容。你的帖子文档有作者,标题,创建等领域。现在你来一起自我思考,“我应该追踪月亮在我发布帖子时的阶段......”,你可以开始添加moon_phase作为新帖子的属性。
如果你想完成,你会回去并将moon_phase添加到旧帖子,但这不是必须的。
在您的观点中,您可以访问moon_phase作为属性。它会为空或导致异常或什么。 (不是JS专家,我认为null是正确答案)
事情是,它并不重要。如果你想改变一些东西,只需改变它。尽管确保你的观点了解这一变化。根据我的经验,这并不需要太多。
此外,如果你真的偏执,你可以存储一个版本/类型的属性,如:
{
_id: "foo-post",
_rev: "23490AD",
type: "post",
typevers: 0,
moon_phase: "full"
}
希望有所帮助。
退房ActiveCouch:http://code.google.com/p/activecouch/
CouchDB的是无模式的有目的的,所以没有从ActiveRecord的迁移到CouchDB的等效概念的1对1映射。但是,ActiveCouch确实包含了对CouchDB“视图”的迁移。
如果您拥有架构并仍希望使用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)
给每个文档。
看起来像activecouch现在在GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan 2009-02-20 08:19:05