Ruby on rails 在Rails 3中从SQl切换到MongoDB

Ruby on rails 在Rails 3中从SQl切换到MongoDB,ruby-on-rails,mongodb,ruby-on-rails-3,mongoid,nosql,Ruby On Rails,Mongodb,Ruby On Rails 3,Mongoid,Nosql,我正在考虑将一个相当大的应用程序(Rails 3.0.10)从我们的SQL数据库(SQLite和Postgres)切换到MongoDB。我计划把所有东西都放进去,主要是utf-8字符串、二进制文件和用户数据。(可能还需要一点全文搜索)我有复杂的关系(web结构:类别、标记、翻译…,还有多态性),我觉得MongoDB的理念是避免这种情况,并将所有内容都放在大文档中,对吗 有人在Rails中使用MongoDB的经验吗?特别是将应用程序从ActiveRecord切换到Mongoid?你认为这是个好主意

我正在考虑将一个相当大的应用程序(Rails 3.0.10)从我们的SQL数据库(SQLite和Postgres)切换到MongoDB。我计划把所有东西都放进去,主要是utf-8字符串、二进制文件和用户数据。(可能还需要一点全文搜索)我有复杂的关系(web结构:类别、标记、翻译…,还有多态性),我觉得MongoDB的理念是避免这种情况,并将所有内容都放在大文档中,对吗

有人在Rails中使用MongoDB的经验吗?特别是将应用程序从ActiveRecord切换到Mongoid?你认为这是个好主意吗?您是否知道学习MongoDB组织复杂数据的方法的指南/文章


ps:在MongoDB中,我特别喜欢它的架构和性能导向带来的自由。我的主要动机是考虑转换。

< P>我用蒙古语使用MangoDB,5-6个月。也曾与postgres+AR、MySQL+AR合作过。没有将AR切换到mongoid的经验


您是否面临任何性能问题或期望很快解决这些问题?如果不是,我建议避免切换,因为这个决定似乎只是基于Mongodb的冷静因素

它们都有各自的优点和缺点,我喜欢mongodb的速度,但在实现这一点上有很多限制(比如没有连接、没有事务支持、字段与字段(更新的>创建的)查询速度慢)

如果存在性能问题,我仍然建议您坚持使用当前系统,因为切换可能是一项艰巨的任务,如果您将一半的时间用于优化当前系统,效果会更好。在阅读了这个问题之后,我感觉到您以前从未使用过mongodb,有很多东西会咬到您,您可能不知道如何解决它们

但是,如果仍然坚持切换,则需要仔细评估数据结构和查询方式。在关系数据库中,您有正常的表单,其优点是无论您从什么结构开始,一旦您进行了规范化,您将大致达到相同的最终结果。在mongodb中,您可以使用几乎无限的方式对文档进行建模。您需要仔细地为文档建模,以利用mongodb的优势。您需要运行的查询在结构化以及要存储的实际数据中起着非常重要的作用

请记住,您在mongodb中没有连接(通过良好的建模可以缓解)。到目前为止,您不能有类似于,
field1=field2
这样的查询,也就是说,您不能比较字段,但需要提供一个文本来进行查询

看看这个问题:。有人将OP指向一个讨论,其中建议使用嵌入式文档,但情况非常类似,OP选择使用独立文档,因为他将使用的查询的性质来获取数据

我想说的是,这应该是一个明智的决定,应该在您使用mongodb对系统进行完全建模之后,使用一些真实数据进行一些性能测试,看看mongodb是否能解决您的问题,而不应该基于冷静因素

更新


您可以使用
$where
子句执行
field1=field2
,但其速度较慢,建议避免使用。

我们目前正在生产应用程序中从PostgreSQL、tsearch和PostGIS切换。至少可以说,这是一个具有挑战性的过程。我们的数据模型更适合mongodb,因为我们不需要进行复杂的连接。我们可以很容易地将数据建模到mongodb提供的嵌套文档结构中

我们已经启动了一个镜像站点,其中包含mongodb的更改,这样我们就可以在整个过程中蹒跚前行,而不必去管生产站点。我不想吓唬你,因为最终,我们会很高兴我们做出了改变——但这是一项艰巨的工作。我同意鲁比什的回答:了解情况,做出你认为最好的决定。不要基于“冷静”因素

如果您必须改变,以下是我们经验中的一些提示:

  • ElasticSearch非常适合mongo的文档结构,以取代PostgreSQL的tsearch全文搜索扩展。
    • 它还非常支持基于点的地理索引。(最接近或在x英里/公里内的关注点)
  • 我们使用Mongo的内置GridFS来存储文件,这非常有效。它简化了跨服务器集群共享用户贡献的图像和文件
  • 我们使用rake任务将postgresql中的数据转储为yaml格式。然后,我们在镜像站点中有另一个rake任务,它将数据导入并转换为存储在mongodb中的模型。
    • 数据导出/导入可能使用共享的redis数据库、两侧的resque以及生产应用程序中的观察者来记录发生的更改
我们使用Mongoid作为我们的ODM,在我们的模型中有很多作用域需要重写才能使用Mongoid vs ActiveRecord

总之,我们对MongoDB非常满意。它为我们建模数据的方式提供了更大的灵活性。我真希望我们能在项目开始之前发现它。

跳过活动记录

或者,如果您已经创建了应用程序,请查看config/application.rb 并将第一行更改为:

需要“rails/all”

为此: 需要“控制器/轨道连接的操作” 要求采取“行动”\u邮递员/railtie 需要“活动资源/railtie” 需要“轨道/测试单元/钢轨接头”

同样重要的是,确保注释掉对发电机组中活动记录的引用:

配置生成器值。还有许多其他选项可用,请务必查看文档

# config.generators do |g|
#   g.orm             :active_record
#   g.template_engine :erb
#   g.test_framework  :test_unit, :fixture => true
# end
在写这篇文章时,它是