将 Rails 项目从 MySQL 迁移到 MongoDB

Posted

技术标签:

【中文标题】将 Rails 项目从 MySQL 迁移到 MongoDB【英文标题】:Moving rails project from MySQL to MongoDB 【发布时间】:2011-07-17 06:47:09 【问题描述】:

我有一个正在开发的项目。我使用 mysql 和 ActiveRecord。看起来这个项目是开始使用带有 Mongoid 适配器的 MongoDB(我从未使用过)的好项目。

将我的项目迁移到 Mongo 的最佳方式是什么?据我了解,我应该编辑我的模型(没什么大不了的),仅此而已?

如何将我的数据从 Mysql 数据库导出到 Mongo?我刚刚尝试过 yaml_db,但它对我没有帮助。

第二个问题是,如果我的系统崩溃,我应该如何保护我的 Mongo 数据库(据我所知,只要将数据存储在 RAM 中,Mongo 就会丢失数据)。我的数据库是 10%/90% 写入/读取。

【问题讨论】:

1.看起来我的数据更符合文档意识形态; 2.教育原因; 3.这个项目对数据安全不重要,所以我可以做这个实验 【参考方案1】:

我最近做了类似的事情,并将其视为一个 3 步过程。可能有更多的 Rails 方式可以做到这一点,但这种方式对我有用,而且很轻松。

我使用了一种迭代方法,并利用了 MongoDB 实际上是一个对关系非常友好的文档存储系统这一事实。我开始使用 Mongoid 的 Relational Associations(页面底部)语法的 references_many 和 referenced_in 进行关系设置。一旦一切正常,我就迭代地重构为更加面向文档的方法。

1.将现有数据库直接转储到 MongoDB

我使用现有模型将 SQL 表和数据强制转储到并行 MongoDB 文档中。我只是把我所拥有的一切都猛烈抨击到他们身上,而不用担心命名或关系;表到集合的严格 1:1 映射。

这对我来说是一次性的过程。一切就绪后,第 2 步和第 3 步获取这些数据并将其转换为我想要的结构。我还可以更改我的模型,因为我不再需要与关系系统进行交互。您可能需要创建现有模型的某种副本,以防出于任何原因需要返回此步骤。

2。迁移数据

下一步我使用了一个自定义的 ruby​​ shell 应用程序。同样,可能有更好的方法来使用 Rails 功能来做到这一点,但我采用了直接的事务脚本样式方法。

我使用了原始的MongoDB Ruby driver,读取了在步骤 1 中创建的数据库,并将源集合转换为我想要的形状。我为目标使用了与第 1 步中创建的数据库不同的数据库,因为在第 3 步中重构模型时,我反复修改此脚本以变得越来越面向文档。

3.根据需要重构模型

我重构了我的模型以针对第 2 步中创建的数据库运行,使我的测试通过,然后返回第 2 步中的脚本并进行更改以使数据库更加面向文档。

我迭代了第 2 步和第 3 步,直到我重构了我的模型和文档布局,直到我得到了最终结果。

【讨论】:

感谢您分享您的经验【参考方案2】:

Re:你的第二个问题

1.8.0 现在通过添加日志支持单服务器持久性(请参阅文档here)。也就是说,当您使用日志时,mongo 将每 100 毫秒发出一次批量提交(在未来的版本中会更频繁)。一旦它在日志中,如果它崩溃了,它就可以重新启动并恢复。您可以要求对 Mongo 的调用在安全提交之前不返回(以轻微的性能损失为代价),或者如果使用副本集,您可以说明在返回之前应该将更改复制到多少个节点 - 这样您就可以确保它已被复制到大多数/所有节点。

【讨论】:

【参考方案3】:

其他人回答了您的第二个问题,从 MySQL 迁移到 MongoDB 取决于您的数据是什么样的。没有可以转换数据库的自动工具。您可能只想编写自己的转换脚本。

我建议按照您的尝试将一个模型转储到 YAML 中,将该模型转换为使用 Mongoid,然后读取 YAML 并重新创建对象。

但是,如果您有复杂的关系数据,那么 MongoDB 可能不是您想要的。阅读键值存储和关系数据库之间的区别。

有一个流行的问题恰好涵盖了这一点:When to use MongoDB or other document oriented database systems?

【讨论】:

我几天前读过这个问题。我知道我可以简化我的数据库,去掉一些连接,所以我想试试 Mongo。 如果你真的只是想试试 MongoDB,那就写点新东西。我实际上做了同样的事情,不久前尝试了 Mongoid:wrote my own url shortening service【参考方案4】:

区别在于你有嵌入对象的功能。 在您的模型中使用它。您也可以使用Event Sourcing 来防止崩溃。

【讨论】:

以上是关于将 Rails 项目从 MySQL 迁移到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

将 rails 应用程序从 3.2.3 迁移到 rails 4.0.0.rc2 后无法在 Heroku 上部署

从原型迁移到 Jquery Rails,empty() 函数不起作用

将ABP的数据库从SQLSERVER迁移到MySql

MySQL:将查询从 v4 迁移到 v5

Rails迁移以将主键添加到现有表

从青铜到黄金,对着mysql学,一文搞定mongoDB