有没有用于NoSQL数据库架构迁移的工具?

27

我正在寻找一种自动化架构迁移的方式,适用于像MongoDB或CouchDB这样的数据库。

最好使用Python编写此工具,但其他任何语言也可以。


问题是如何在NoSQL中模拟关系特性?例如,在键值存储中如何正确处理多对多关系或约束条件?顺便说一下,欢迎来到SO :-) - sastanin
2
不,我是指架构迁移。如何从一个文档版本迁移到另一个版本(重命名字段等)。 - Alexander Artemenko
对于MongoDB,有一个名为mongodb-migrations的Python包,可以实现模式风格的迁移。https://pypi.org/project/mongodb-migrations/ 当我们将某种类型文档中的属性从字符串更改为数组时,这对我非常有用。 - Caleb Jay
4个回答

21

由于Nosql数据库可以包含大量数据,因此无法按照常规的关系型数据库迁移数据。实际上,当数据达到一定大小阈值时,您也无法在关系型数据库中进行迁移。关闭网站一整天以添加现有表的字段是不切实际的。因此,在关系型数据库中,您最终会做出丑陋的修补,例如为该字段添加新表并进行连接以获取数据。

  • 正如其他人建议的那样,您可以编写代码以处理可能模式的不同“版本”。这通常比看起来简单。许多模式更改都很容易进行编码处理。例如,如果要向模式添加新字段,则只需将其添加到所有新记录中,而在所有旧记录中它将为空(您不会收到“字段不存在”的错误或其他任何内容)。如果需要旧记录中的“默认”值,则可以通过简单的代码轻松完成。
  • 另一个选项,实际上是处理像字段重命名和结构更改等非平凡模式更改的唯一明智选项,是在每个记录中存储schema_version,并在读取时编写用于从任何版本迁移数据到下一个版本的代码。即,如果当前的模式版本为10,您从具有版本7的数据库中读取记录,则您的数据库层应调用migrate_8、migrate_9和migrate_10。这样,访问的数据将逐步迁移到新版本。如果不访问它,那么谁在乎它是哪个版本;)

2
这些数据库所谓的好处之一是它们无需架构迁移工具,因此是无模式的。相反,您需要编写数据处理代码以处理存储在数据库中的各种数据。

5
写代码处理所有文档版本很难。代码不断发展,数据库也应该跟着发展。这样的数据库并非无模式(schemaless),而是无强制模式(schema free)。这意味着你可以有一些文档结构,但没有严格的限制。 - Alexander Artemenko
2
我认为对于NoSQL数据库,我们需要有“数据迁移”工具,而不是“模式迁移”工具。如果没有这样的工具,那么我会自己编写一个。 - Alexander Artemenko
我不确定“schemaless”和“schema free”的区别是什么。无论如何,这些数据库的一个优点是,在架构更改时不必更新所有数据。例如,您可以在发现记录/文档以旧格式存在时逐个更新每个记录/文档。如果您找不到所需工具,则要么是在开辟新的道路,要么是没有理解NoSQL文化。 - Ned Batchelder
2
好的。为了将数据更新到新版本,我需要一个工具。在我看来,这比拥有适用于所有文档版本的代码更方便。你真的不明白无模式和无架构之间的区别吗? :-) - Alexander Artemenko
5
这并不是一个富有建设性的回答。亚历山大正在寻找一种工具,他并不希望有人解释为什么可能不需要这样的工具,你也不知道他实际上需要它的原因,尽管数据库是无模式的/自由的。通过避免管理数据的多个版本,因此在集合结构发生更改时迁移数据是有用的,可以简化代码。 - Romain G

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

当然,如果你的数据"老化"并最终到期,这就可以为你进行模式迁移 - 只需为新添加的数据更改格式,然后等待所有以旧格式存储的数据到期 - 然后你可以淘汰向后兼容的代码。


1
嗯,这很有道理。但问题是关于现成的工具,可以帮助我保持文档版本最新。 - Alexander Artemenko

1

当一个项目需要对NoSQL数据库进行模式迁移时,这让我想到你仍然在以关系型数据库的方式思考,但是使用的是NoSQL数据库。

如果有人要开始使用NoSQL数据库,你需要意识到大多数关系型数据库(如MySQL)的“规则”也需要被抛弃。例如严格的模式、规范化、使用多个对象之间的关系等。NoSQL存在的目的是解决不需要关系型数据库提供的所有额外“功能”的问题。

我建议您编写代码时不要期望或需要NoSQL数据库的硬模式 - 您应该支持旧模式,并在访问时动态转换文档记录,如果您确实希望在该记录上拥有更多的模式字段。

请记住,与使用关系型数据库时相比,NoSQL存储在思考和设计时表现最佳


这不是一个解决方案。感谢您的“有趣”IMHO。 - Alexander Artemenko
2
不,这不是一个“解决方案”,被接受的答案也不是,因为如果你以同样的方式看待答案,它基本上是一个“你不能这样做”。我所试图做的就是引起人们的注意,如果他们真的需要在NoSQL数据库上使用硬模式,那么他们应该认真质疑自己。模式可能会在规模上造成问题,这也是NoSQL是一个良好的扩展解决方案的原因之一,它们没有硬模式。 - Astra
4
使用 NoSQL 数据库并不意味着您需要忘记使用关系数据库管理系统学到的良好实践,相反,有多种工具可提供应用程序级别的数据架构验证。NoSQL 投注于通过去范式化来增加速度,这已经在关系数据库管理系统中使用过(这也是 NoSQL 发明的一部分),但并不意味着所有来自 RDBMS 的东西都应该被丢弃,这取决于您正在开发的应用程序。 - Romain G
这实际上是解决方案,也是正确答案。问题是错误的,而这个答案展示了为什么。 - enanone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接