25

我正在寻找一种为 MongoDB 或 CouchDB 等数据库自动进行模式迁移的方法。

最好,这个工具应该用 python 编写,但任何其他语言都可以。

4

4 回答 4

18

由于 nosql 数据库可以包含大量数据,因此您无法在常规 rdbms 中迁移它。实际上,一旦您的数据超过某个大小阈值,您就无法为 rdbms 执行此操作。让您的网站停工一天以将字段添加到现有表是不切实际的,因此使用 rdbms 您最终会做丑陋的补丁,例如仅为该字段添加新表并进行连接以获取数据。在 nosql 世界中,您可以做几件事。

  • 正如其他人建议的那样,您可以编写代码,以便它处理可能模式的不同“版本”。这通常比看起来更简单。许多类型的模式更改对代码来说都是微不足道的。例如,如果您想向架构中添加一个新字段,您只需将其添加到所有新记录中,并且所有旧记录上它都将为空(您不会收到“字段不存在”错误或任何内容;)。如果您需要旧记录中的字段的“默认”值,那么在代码中太简单了。
  • 另一种选择,实际上是唯一明智的选择,例如字段重命名和结构更改等非平凡的模式更改,是将 schema_version 存储在 EACH 记录中,并使用代码将数据从任何版本迁移到READ上的下一个版本。即,如果您当前的模式版本是 10,并且您从数据库中读取了版本为 7 的记录,那么您的数据库层应该调用 migrate_8、migrate_9 和 migrate_10。这样访问的数据会逐渐迁移到新版本。如果它没有被访问,那么谁在乎它是哪个版本;)
于 2010-06-09T16:03:26.987 回答
2

如果您的数据足够大,您可能会发现您永远无法迁移数据,或者这样做没有好处。这意味着当您进行架构更改时,代码需要永远向后兼容旧格式。

当然,如果您的数据“老化”并最终过期,这可以为您进行架构迁移 - 只需更改新添加数据的格式,然后等待旧格式的所有数据过期 - 然后您可以取消向后兼容性代码。

于 2009-12-27T16:50:07.403 回答
2

这些数据库的假定好处之一是它们是无模式的,因此不需要模式迁移工具。相反,您编写数据处理代码来处理存储在 db 中的各种数据。

于 2009-12-25T12:18:32.237 回答
1

当一个项目需要对 NoSQL 数据库进行模式迁移时,我认为您仍在以关系数据库的方式思考,但使用的是 NoSQL 数据库。

如果有人要开始使用 NoSQL 数据库,您需要意识到 RDBMS(即 MySQL)的大部分“规则”也需要被排除在外。诸如严格模式、规范化、使用对象之间的许多关系之类的事情。NoSQL 的存在是为了解决不需要 RDBMS 提供的所有额外“功能”的问题。

我会敦促您以不期望或不需要 NoSQL 数据库的硬架构的方式编写代码 - 如果您真的想要更多架构,您应该支持旧架构并在访问时动态转换文档记录该记录上的字段。

请记住,与使用 RDBMS 相比,当您以不同的方式思考和设计时,NoSQL 存储效果最佳

于 2010-06-09T16:13:05.090 回答