Rails 使用迁移的概念来处理使用 ActiveRecord API 的模型更改。
CouchDB 使用 JSON(嵌套映射和数组)来表示其模型对象。
到目前为止,在使用 CouchDB 时,我没有看到识别文档结构何时发生变化的好方法(除了作为开发人员受到纪律处分),或者将文档从旧模型迁移到新模型。
在 CouchDB 中是否有现有功能或者您有处理模型更改的最佳实践?
Rails 使用迁移的概念来处理使用 ActiveRecord API 的模型更改。
CouchDB 使用 JSON(嵌套映射和数组)来表示其模型对象。
到目前为止,在使用 CouchDB 时,我没有看到识别文档结构何时发生变化的好方法(除了作为开发人员受到纪律处分),或者将文档从旧模型迁移到新模型。
在 CouchDB 中是否有现有功能或者您有处理模型更改的最佳实践?
RDBMS 去洗脑的时间。:)
couchdb 无模式设计的最大要点之一就是直接针对防止迁移的需要。对象的 JSON 表示可以很容易地直接输入您的对象。
例如,假设您有一个博客类型的网络应用程序,其中包含帖子以及人们在博客中存储的任何花哨的东西。您的帖子文档包含作者、标题、创建时间等字段。现在您来思考一下,“我应该在发布帖子时跟踪月亮处于什么相位......”您可以开始添加 moon_phase 为新帖子的属性。
如果您想完整,您会返回并将 moon_phase 添加到旧帖子中,但这并不是绝对必要的。
在您的视图中,您可以将 moon_phase 作为属性访问。它将为空或导致异常或其他东西。(不是 JS 专家,我认为 null 是正确的答案)
问题是,这并不重要。如果你想改变一些东西,就改变它。虽然要确保你的观点理解这种变化。根据我的经验,这并不需要太多。
此外,如果你真的很偏执,你可能会存储一个版本/类型属性,如:
{
_id: "foo-post",
_rev: "23490AD",
type: "post",
typevers: 0,
moon_phase: "full"
}
希望有帮助。
查看ActiveCouch。
CouchDB 是无模式的,因此从 ActiveRecord 迁移到 CouchDB 等价物的概念没有一对一的映射。但是,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
如果您想一次升级整个数据库,只需调用read(doc_id)
每个文档。