5

像我们大多数人一样,我来自关系数据库世界,我目前正在研究文档数据库世界的可能性。我关心的一个问题是处理数据模型随时间的变化(添加新属性、重命名属性、添加关系......)。

在关系数据库中,这通常按如下方式处理:

  • 编写数据库迁移
    -> 修改数据库架构
    -> 修复现有行的数据(通常包含一些业务逻辑)
  • 修改代码(ORM 更新,..)


在使用文档数据库时,我感觉对数据模型的更改要容易得多;无需更新数据库模式,主要是添加一个属性,.. 一切都“正常工作”。我想知道团队如何在现实生活中管理这种迁移,带有文档数据库的企业项目:

  • 对存储在文档数据库中的类型进行更改是否有严格的政策?例如,对这种类型的每次更改都需要迁移以更新现有文档吗?
  • 因此,数据模型(存储在文档 db 中的类型)和业务模型之间是否有明确的分离?

谢谢你的时间,
科恩

4

2 回答 2

1

With RavenDB, you can do that with patching. See: http://ayende.com/blog/157185/awesome-ravendb-feature-of-the-day-evil-patching And: http://blog.hibernatingrhinos.com/12705/new-option-in-the-ravendb-studiondash-patching

于 2012-11-30T12:43:21.140 回答
1

对于 MongoDB 中的“模式”修改,您可以采用三种通用策略。我已经看到这三个都运行良好。您将使用哪一个在很大程度上取决于您的特定用例。

首先:您可以简单地向新文档添加一个新字段,然后编写代码来处理该字段不存在的情况。例如,您可以address在“用户”文档中添加一个 ' ' 字段,但您必须编写客户端代码来处理该字段不存在的情况。

第二:您可以编写代码来查看现有文档并在看到“旧式”文档时对其进行更新。name例如,您可以使用代码检查“用户”文档中是否存在“ ”字段。如果找到该字段,它会将其拆分为“ first_name”和“ sur_name”字段、$unsetname文档中的“ ”字段以及$set新的“ first_name”和“ sur_name”字段到它们的计算值。

第三:您可以批量更新集合中的所有文档以使用新模式。您将编写与上面相同的代码,但不是在应用程序读取文档时懒惰地应用它,而是将其应用于集合中的所有文档。

请注意,最后一种策略可能会对性能产生影响:如果您分页了很多暂时未访问的文档,您将在 MongoDB 系统上增加额外的负载。

于 2012-12-17T23:00:24.413 回答