CouchDB文档模型有变化吗?
Rails使用迁移的概念来使用ActiveRecord API处理模型更改。
CouchDB使用JSON(嵌套映射和数组)表示其模型对象。
到目前为止,在使用CouchDB时,我没有很好的方法来识别文档的结构何时发生了变化(除了受开发人员约束之外),或者无法将文档从旧模型迁移到新模型。
是否有现有功能,或者我们有最佳实践来处理CouchDB中的模型更改?
解决方案
查看ActiveCouch:http://code.google.com/p/activecouch/
CouchDB的目的是无模式的,因此没有从ActiveRecord迁移到CouchDB等效概念的一对一映射。但是,ActiveCouch确实包括针对CouchDB的"视图"的迁移。
RDBMS去洗脑的时间。 :)
benchdb的无模式设计的最大优点之一就是直接防止了迁移需求。对象的JSON表示形式使我们可以轻松地对对象进行类型化处理。
例如,假设我们有一个博客类型的Web应用程序,其中包含帖子以及人们存储在博客中的任何奇特事物。帖子文档中包含诸如作者,标题,创建位置等字段。现在,我们开始思考:"发布帖子时,我应该跟踪月亮处于哪个相位...",我们可以开始将moon_phase添加为新帖子的属性。
如果要完成操作,我们可以返回并在旧帖子中添加moon_phase,但这并不是绝对必要的。
在视图中,我们可以访问moon_phase作为属性。并且它将为null或者导致异常或者其他原因。 (不是JS专家,我认为null是正确的答案)
问题是,这并不重要。如果我们想更改某些内容,请进行更改。尽管请确保观点理解该更改。以我的经验,这实际上并不需要太多。
另外,如果我们真的很偏执,则可以存储一个version / type属性,如下所示:
{ _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)
。