有没有用于NoSQL数据库的模式迁移工具?
我想找一种方法来自动化数据库的结构迁移,像MongoDB或CouchDB这样的数据库。
最好这个工具是用Python写的,不过其他语言也可以。
4 个回答
2
如果你的数据量非常大,你可能会发现根本无法迁移这些数据,或者迁移数据并没有什么好处。这意味着,当你对数据结构进行更改时,代码必须始终能够兼容旧的格式。
当然,如果你的数据会随着时间的推移而过期,这样就可以自动进行数据结构的迁移了——只需对新添加的数据更改格式,然后等旧格式的数据过期,之后就可以去掉兼容旧格式的代码了。
2
这些数据库的一个好处是它们没有固定的结构,也就是说你不需要使用那些专门的工具来改变数据结构。相反,你需要编写处理数据的代码,以应对数据库中存储的各种不同类型的数据。
21
因为NoSQL数据库可以存储大量数据,所以你不能像在传统的关系型数据库(RDBMS)中那样简单地迁移数据。实际上,当你的数据超过某个大小时,关系型数据库也无法轻易迁移。比如说,你不能为了给现有的表添加一个字段而让网站停一天,这样做太不实际了。因此,在关系型数据库中,你最终会做一些很麻烦的处理,比如为了一个字段而添加新表,然后通过连接查询来获取数据。
在NoSQL的世界里,你可以做几件事情。
- 正如其他人所建议的,你可以编写代码来处理不同“版本”的数据结构。这通常比看起来简单得多。许多类型的数据结构变化其实很容易处理。例如,如果你想在数据结构中添加一个新字段,你只需将其添加到所有新记录中,旧记录中的这个字段会是空的(你不会遇到“字段不存在”的错误;)。如果你需要给旧记录中的这个字段一个“默认”值,这在代码中也很简单。
- 另一个选择,实际上也是在进行一些复杂的数据结构变化(比如字段重命名和结构调整)时唯一合理的选择,就是在每条记录中存储一个schema_version(数据结构版本),并编写代码在读取时将数据从任何版本迁移到下一个版本。也就是说,如果你当前的数据结构版本是10,而你从数据库中读取到的记录版本是7,那么你的数据库层应该依次调用migrate_8、migrate_9和migrate_10。这样,访问到的数据会逐步迁移到新版本。如果没有被访问,那就没关系,哪个版本又有什么重要呢;)