Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有针对NoSQL数据库的模式迁移工具?_Python_Mongodb_Couchdb_Database_Nosql - Fatal编程技术网

Python 是否有针对NoSQL数据库的模式迁移工具?

Python 是否有针对NoSQL数据库的模式迁移工具?,python,mongodb,couchdb,database,nosql,Python,Mongodb,Couchdb,Database,Nosql,我正在寻找一种方法来自动化MongoDB或CouchDB等数据库的模式迁移 最好是用python编写此工具,但任何其他语言都可以。这些数据库的一个假定好处是它们是无模式的,因此不需要模式迁移工具。相反,您可以编写数据处理代码来处理数据库中存储的各种数据。如果您的数据足够大,您可能会发现您永远无法迁移数据,或者这样做没有好处。这意味着,当您进行模式更改时,代码需要始终与旧格式向后兼容 当然,如果您的数据“过时”并最终过期,这可以为您进行模式迁移-只需更改新添加数据的格式,然后等待旧格式的所有数据过

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


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

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

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


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

由于nosql数据库可能包含大量数据,您无法在常规rdbms中迁移它。事实上,当数据超过某个大小阈值时,您就不能对rdbms执行此操作。将站点关闭一天以将字段添加到现有表中是不切实际的,因此使用rdbms,您最终会执行一些难看的修补程序,例如仅为字段添加新表,并执行连接以获取数据。 在nosql世界中,您可以做几件事

  • 正如其他人所建议的,您可以编写代码,以便它能够处理可能模式的不同“版本”。这通常比看起来更简单。许多类型的模式更改对于编写代码来说都是微不足道的。例如,如果要将新字段添加到架构中,只需将其添加到所有新记录中,所有旧记录中的字段都将为空(不会出现“字段不存在”错误或任何错误;)。如果您在旧记录中需要字段的“默认”值,那么在代码中就太简单了
  • 另一个选项,实际上,对于字段重命名和结构更改等非平凡的模式更改,唯一明智的选择是在每个记录中存储模式_版本,并使用代码在读取时将数据从任何版本迁移到下一个版本。i、 e.如果您当前的模式版本为10,并且您从数据库中读取了版本为7的记录,那么您的数据库层应该调用migrate_8、migrate_9和migrate_10。这样,访问的数据将逐渐迁移到新版本。如果它不被访问,那么谁在乎它是哪个版本呢;)
当一个项目需要对NoSQL数据库进行模式迁移时,我认为您仍然在以关系数据库的方式思考,但使用的是NoSQL数据库

如果有人打算开始使用NoSQL数据库,您需要意识到RDBMS(即MySQL)的大多数“规则”也需要退出窗口。比如严格的模式、规范化、使用对象之间的许多关系。NoSQL的存在是为了解决不需要RDBMS提供的所有额外“特性”的问题

我敦促您以一种不希望或不需要NoSQL数据库的硬模式的方式编写代码——如果您确实希望在该记录上有更多的模式字段,您应该支持旧模式,并在访问时动态转换文档记录


请记住,与使用RDBMS时相比,如果您的想法和设计与使用RDBMS时不同,那么NoSQL存储效果最好。

很难编写代码来处理所有版本的文档。代码不断发展,数据库也应该不断发展。这样的数据库不是无模式的,它们是无模式的。这意味着你可以有一些文档结构,但是没有很强的限制。我认为对于NoSQL数据库,我们必须有“数据迁移”工具,而不是“模式迁移”工具。如果没有,那么我自己写一个。我不确定“无模式”和“无模式”之间有什么区别。在任何情况下,这些数据库的一个优点是在模式更改时不必更新所有数据。例如,您可以在读取和发现每个记录/文档为旧格式时对其进行更新。如果你没有找到任何工具来做你想做的事情,你要么是在开辟一条新的道路,要么就是不理解NoSQL文化。要将数据更新到新版本,我需要一个工具。在我看来,拥有可以处理所有版本文档的代码更方便。你们真的不明白无模式和无模式的区别吗?:-)这不是一个建设性的答案。Alexander要求提供一个工具,他不希望有人解释为什么他可能不需要这样的工具,你不知道他实际需要它的原因,尽管数据库是schema[less/free]。通过避免管理数据的多个版本,从而在集合结构更改时迁移数据,简化代码非常有用。问题是如何在NoSQL中模拟关系特性?例如,在键值存储中处理多对多关系的正确方法是什么?还是约束?欢迎来到SO,顺便说一下:-)不,我是说模式迁移。如何从一个文档版本迁移到另一个文档版本(重命名字段等)。嗯,这很有意义。但问题是关于现成的工具,它将帮助我保持文档版本的最新。这不是一个解决方案。谢谢你“有趣”的回答。不,这不是一个“解决方案”——也不是公认的答案,因为如果你以同样的方式看待答案,它基本上是一个“你不能做”。我所要做的就是提请大家注意这样一个事实:如果他们真的需要NoSQL数据库上的硬模式,那么他们应该真正地扪心自问。模式可能会在规模上造成问题,这也是NoSQL是一个很好的扩展解决方案的原因之一,因为它们没有硬模式。使用NoSQL数据库并不意味着您必须忘记好的pra