我正在寻找一种方法来自动化MongoDB或CouchDB等数据库的模式migrations.

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

推荐答案

因为NoSQL数据库可能包含大量数据,所以您不能从常规的RDBMS意义上迁移它.实际上,一旦您的数据超过某个大小阈值,您就不能对RDBMS执行此操作.关闭站点一天来向现有表添加字段是不切实际的,因此使用RDBMS,您最终会做一些难看的补丁,比如只为字段添加新表,并进行连接以获取数据. 在NoSQL世界中,您可以做几件事.

  • 正如其他人所建议的,您可以编写代码,以便它能够处理可能模式的不同"版本".这通常比看起来更简单.许多类型的模式更改对于编写代码来说都是微不足道的.例如,如果您想将一个新字段添加到架构中,只需将其添加到所有新记录中,所有旧记录上的字段都将为空(您不会得到"field not Existence"错误或任何东西;).如果在旧记录中需要字段的"默认"值,那么在代码中就太简单了.
  • 对于字段重命名和 struct 更改等重要的模式更改,另一个选项(实际上也是唯一明智的选项)是将SCHEMA_VERSION存储在每条记录中,并让代码将数据从任何版本迁移到READ上的下一个版本.即,如果您当前的模式版本为10,并且您从版本为7的数据库中读取了一条记录,则您的数据库层应调用Migrate_8、Migrate_9和Migrate_10.这样,访问的数据将逐渐迁移到新版本.如果它没有被访问,那么谁在乎它是哪个版本;)

Database相关问答推荐

使用mongoose 在嵌套对象中查找特定字段

动态数据模型

生产中的超大型 Mnesia 表

如何理解mysql explain 命令

管理数据库中的产品计数

关闭连接会自动关闭语句和结果集吗?

查询最后一天、上周、上个月SQLite

使 H2 将引用的名称和未引用的名称视为相同

使用 jQuery 动态填写表单值

文件访问速度与数据库访问速度

有没有办法在一个脚本中创建多个触发器?

主键、唯一键和外键约束以及索引之间有什么区别?

是否有标准的Electron 商务数据库架构来将折扣/税收/礼券应用于产品?

SQL 中的 CAST 和 CONVERT 是否相同?

PHP 可以与 MS SQL 数据库一起使用吗

如何在文件系统中存储图像

PHP PDO: error number' 00000' when query is correct

如何以 SYS 身份在 Java 中连接到 Oracle?

以可能的数据丢失为代价提高 PostgreSQL 写入速度?

Cassandra - 事务支持