2011-03-17 66 views
4

我有一个项目正在开发中。我使用mysql和ActiveRecord。看起来这个项目是一个很好的开始使用MongoDB(我从来没有用过)的Mongoid适配器。将rails项目从MySQL移动到MongoDB

什么是我的项目转移到蒙戈的最佳方式?据我了解,我应该编辑我的模型(不是什么大不了的),这就是全部?

如何从Mysql数据库我的数据导出到蒙戈?我刚刚尝试过yaml_db,但它不帮助我。

而第二个问题是我应该如何保持安全我Mongo的数据库,如果我的系统崩溃(我的理解蒙戈将尽可能在RAM存储数据丢失数据)。我的数据库是10%/ 90%的写/读。

+0

为什么要切换? – 2011-03-17 11:29:20

+3

1.看起来像我的数据更合适文件意识形态; 2.教育理由; 3.这个项目对数据安全并不重要,所以我可以做这个实验 – fl00r 2011-03-17 11:32:10

回答

7

我已经做了类似的事情最近,走近它作为一个3步骤的过程。可能会有更多Rails的方式来做到这一点,但这种方式对我而言并没有什么意义。

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

1.转储现有的数据库直MongoDB的

我用现有的模式,以蛮力转储SQL表和数据转换成并行MongoDB的文件。我只是猛烈抨击了我所拥有的一切,而不用担心命名或关系;表格与集合的严格1:1映射。

这对我来说是一次性的过程。一旦所有事情都在这里,步骤2和步骤3就将这些数据转化为我想要的结构。我也可以改变我的模型,因为我不再需要与关系系统进行交互。您可能希望创建某种现有模型的副本,以防因任何原因需要返回此步骤。

2.迁移数据

对于下一步我有一个自定义的红宝石外壳程序去了。再次说明,使用Rails功能可能会有更好的方式来完成此任务,但我采用了直接的事务脚本样式方法。

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

3.重构模型需要

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

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

+1

谢谢你分享你的经验 – fl00r 2011-03-17 17:26:38

3

回复:你的第二个问题

1.8.0现在支持单一服务器的耐用性,通过添加日志记录(见文档here)。这表明,当你使用日志时,mongo会每隔100ms发出一次批量提交(在未来的版本中会更频繁)。一旦它在期刊中,如果它崩溃,它就会恢复并恢复。您可以请求调用Mongo,直到它安全地执行为止(价格较低时性价比较高),或者如果使用副本集,您可以在返回之前指出应该将更改复制到多少个节点,以便您可以制作确定它已被复制到大多数/所有节点。

0

DIFF是,你必须嵌入对象的设施。 在您的模型中使用它。你也可以使用Event Sourcing来防止崩溃。

1

的人回答你的第二个问题,从迁移到MySQL的MongoDB的取决于你的数据看起来虽然。没有可以转换数据库的自动工具。您可能只想编写自己的转换脚本。

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

如果您有复杂的关系数据虽然MongoDB的可能不是什么都在寻找反正。阅读关键值存储和关系数据库之间的差异。

有一种流行的问题,涵盖只是:When to use MongoDB or other document oriented database systems?

+0

我前几天读过这个问题。我明白我可以简化我的数据库,抛出一些连接,所以我想尝试Mongo。 – fl00r 2011-03-17 12:14:20

+0

如果你真的只想尝试MongoDB,只需写一些新的东西。我实际上做了同样的事情,前一段时间尝试使用Mongoid:[写下我自己的URL缩短服务](http://blog.impaled.org/2011/3/9/write-your-own-url-shortening -service-seriously.html) – 2011-03-17 12:24:25

+0

不是一个坏主意:) – fl00r 2011-03-17 12:27:33