Python 是否有针对NoSQL数据库的模式迁移工具?
我正在寻找一种方法来自动化MongoDB或CouchDB等数据库的模式迁移Python 是否有针对NoSQL数据库的模式迁移工具?,python,mongodb,couchdb,database,nosql,Python,Mongodb,Couchdb,Database,Nosql,我正在寻找一种方法来自动化MongoDB或CouchDB等数据库的模式迁移 最好是用python编写此工具,但任何其他语言都可以。这些数据库的一个假定好处是它们是无模式的,因此不需要模式迁移工具。相反,您可以编写数据处理代码来处理数据库中存储的各种数据。如果您的数据足够大,您可能会发现您永远无法迁移数据,或者这样做没有好处。这意味着,当您进行模式更改时,代码需要始终与旧格式向后兼容 当然,如果您的数据“过时”并最终过期,这可以为您进行模式迁移-只需更改新添加数据的格式,然后等待旧格式的所有数据过
最好是用python编写此工具,但任何其他语言都可以。这些数据库的一个假定好处是它们是无模式的,因此不需要模式迁移工具。相反,您可以编写数据处理代码来处理数据库中存储的各种数据。如果您的数据足够大,您可能会发现您永远无法迁移数据,或者这样做没有好处。这意味着,当您进行模式更改时,代码需要始终与旧格式向后兼容
当然,如果您的数据“过时”并最终过期,这可以为您进行模式迁移-只需更改新添加数据的格式,然后等待旧格式的所有数据过期-然后您可以取消向后兼容代码。由于nosql数据库可能包含大量数据,您无法在常规rdbms中迁移它。事实上,当数据超过某个大小阈值时,您就不能对rdbms执行此操作。将站点关闭一天以将字段添加到现有表中是不切实际的,因此使用rdbms,您最终会执行一些难看的修补程序,例如仅为字段添加新表,并执行连接以获取数据。 在nosql世界中,您可以做几件事
- 正如其他人所建议的,您可以编写代码,以便它能够处理可能模式的不同“版本”。这通常比看起来更简单。许多类型的模式更改对于编写代码来说都是微不足道的。例如,如果要将新字段添加到架构中,只需将其添加到所有新记录中,所有旧记录中的字段都将为空(不会出现“字段不存在”错误或任何错误;)。如果您在旧记录中需要字段的“默认”值,那么在代码中就太简单了
- 另一个选项,实际上,对于字段重命名和结构更改等非平凡的模式更改,唯一明智的选择是在每个记录中存储模式_版本,并使用代码在读取时将数据从任何版本迁移到下一个版本。i、 e.如果您当前的模式版本为10,并且您从数据库中读取了版本为7的记录,那么您的数据库层应该调用migrate_8、migrate_9和migrate_10。这样,访问的数据将逐渐迁移到新版本。如果它不被访问,那么谁在乎它是哪个版本呢;)李>
请记住,与使用RDBMS时相比,如果您的想法和设计与使用RDBMS时不同,那么NoSQL存储效果最好。很难编写代码来处理所有版本的文档。代码不断发展,数据库也应该不断发展。这样的数据库不是无模式的,它们是无模式的。这意味着你可以有一些文档结构,但是没有很强的限制。我认为对于NoSQL数据库,我们必须有“数据迁移”工具,而不是“模式迁移”工具。如果没有,那么我自己写一个。我不确定“无模式”和“无模式”之间有什么区别。在任何情况下,这些数据库的一个优点是在模式更改时不必更新所有数据。例如,您可以在读取和发现每个记录/文档为旧格式时对其进行更新。如果你没有找到任何工具来做你想做的事情,你要么是在开辟一条新的道路,要么就是不理解NoSQL文化。要将数据更新到新版本,我需要一个工具。在我看来,拥有可以处理所有版本文档的代码更方便。你们真的不明白无模式和无模式的区别吗?:-)这不是一个建设性的答案。Alexander要求提供一个工具,他不希望有人解释为什么他可能不需要这样的工具,你不知道他实际需要它的原因,尽管数据库是schema[less/free]。通过避免管理数据的多个版本,从而在集合结构更改时迁移数据,简化代码非常有用。问题是如何在NoSQL中模拟关系特性?例如,在键值存储中处理多对多关系的正确方法是什么?还是约束?欢迎来到SO,顺便说一下:-)不,我是说模式迁移。如何从一个文档版本迁移到另一个文档版本(重命名字段等)。嗯,这很有意义。但问题是关于现成的工具,它将帮助我保持文档版本的最新。这不是一个解决方案。谢谢你“有趣”的回答。不,这不是一个“解决方案”——也不是公认的答案,因为如果你以同样的方式看待答案,它基本上是一个“你不能做”。我所要做的就是提请大家注意这样一个事实:如果他们真的需要NoSQL数据库上的硬模式,那么他们应该真正地扪心自问。模式可能会在规模上造成问题,这也是NoSQL是一个很好的扩展解决方案的原因之一,因为它们没有硬模式。使用NoSQL数据库并不意味着您必须忘记好的pra