2011-05-29 108 views
6

我正在寻找更好的方法(又名架构)来拥有不同种类的数据库(MySQL + MongoDB)后端相同的Rails应用程序。Rails:混合NOSQL和SQL数据库

我在主梁猜测3.1应用程序,安装导轨3.1引擎链接的每个不同类型的DB的...

...或具有主Rails的3.0.x的应用程序的路由每个端点西纳特拉MySQL/MongoDB istance ...

你认为这是可能的......,任何想法或建议?

我注意到其他一些类似的问题,但我认为“安装应用程序”在Rails 3.1/Rack/Sinatra中快速移动,我们都需要调整我们的范例。

在此先感谢 卢卡G.索阿韦

回答

10

有没有必要完全运行两个应用程序只是为了有两种类型的数据库的过度复杂的事情。这听起来像你需要DataMapper。它将完全满足您开箱即用的需求。获得dm-rails gem将其与Rails集成。

在DataMapper中,与ActiveRecord不同,您必须提供有关底层数据存储的所有详细信息:它具有哪些字段,它们如何映射模型中的属性,表名称是什么(如果在数据库中),后端它使用等等。

阅读文档...有一桶代码给你一个想法。

每个模型只是一个普通的旧Ruby对象。类定义只是混入DataMapper::Resource,这使您可以访问所有的DataMapper的功能:但是

class User 
    include DataMapper::Resource 

    property :id,   Serial 
    property :username,  String 
    property :password_hash, String 
    property :created_at, DateTime 
end 

你有大量的控制。例如,我可以指定此模型不存储在我的默认数据存储库(存储库)中,并且存储在其他配置的数据存储区之一(如果您喜欢,可以是NoSQL存储区)。

class User 
    include DataMapper::Resource 

    storage_names[:some_other_repo] = 'whatever' 

    # ... SNIP ... 
end 

大多数DM在类固醇上的行为与ActiveRecord类似。你得到所有的基本知识,如发现记录(除非你永远不必使用原始字段名,如果你的模型抽象他们离开):

new_users = User.all(:created_at.gte => 1.week.ago) 

你得到验证,你观察,你会得到总处理...然后获得一堆其他的东西,如战略性的急切加载(解决n + 1查询问题),延迟加载大型文本/ blob字段,以及多个存储库支持。在我看来,查询逻辑比AR好得多。只需阅读文档。他们是人性化的。不只是一个API参考。

缺点是什么?那么,许多宝石并没有考虑到你可能没有使用ActiveRecord,所以当你需要一些宝石时,有更多的搜索要做。不过随着时间的推移,这会变得更好,因为在Rails 3.x将DM与Rails无缝集成之前并不那么容易。

+0

...你能更具体吗?我的意思是,我真的很舒服,mongoid,从Rails的角度来看也是如此。无论如何,我们还需要管理MySQL数据库,以响应相同的应用程序。提前致谢。 – 2011-05-29 11:57:09

+0

看到我的更新,并阅读文档...它都在那里。内置多个数据库/无SQL /无论你如何支持。 – d11wtq 2011-05-29 12:14:30

+0

这里是DataMapper的MongoDB适配器:https://github.com/solnic/dm-mongo-adapter – d11wtq 2011-05-29 12:18:25

4

我没有完全理解你的问题。像

  1. 什么是你面对现在使用蒙戈和MySQL在相同的应用程序的问题,
  2. 什么换去多Rails应用程序处理不同DBS的原因。

尽管我不是红宝石专家& rails(几个月前拿起),我喜欢在这里添加一些东西。

我目前正在构建在后端利用mongo和MySQL的rails应用程序。 Mongoid & ActiveRecord是驱动程序。 MySql用于事务处理,mongo用于所有其他类型的数据(主要是地理空间)。它直截了当。您可以创建从mongoid和activerecord继承的不同模型。

class Item 
    include Mongoid::Document 
    field :name, :type => String 
    field :category, :type => String 
end 

class User < ActiveRecord::Base 
end 

而且你可以查询两种方式相同的方式(除了复杂的SQL连接,也mongoid有一些另外的查询模式对地理空间类型的查询)

Item.where(:category => 'car').skip(0).limit(10) 
User.where(:name => 'ram') 

它是一件轻而易举的事情。但有一些重要的点你需要知道

  1. 在mongoid模型之前创建你的活动记录模型。一旦激活了mongoid(在rails g mongoid:config - mongoid.yml中添加)所有脚手架,以及几代人都可以使用mongo db。否则,每次需要在创建Activerecord模型之前删除mongoid.yml
  2. 并且不要以关系方式使用mongoid。我知道mongoid提供了很多选项来定义实现。就像Belongs_to关系一样,将参考ID存储在子文档中。它与mongo DbRef完全相反。当离开mongo习语为有利的记录感觉时,它非常混乱。所以尽量坚持它的文档性质。必要时使用嵌入和DbRef。 (可能有人corrcet我如果我错了)

仍然Mongoid是一个伟大的工作。它充满了功能。

+0

是的,看起来实际上它工作正常......有一些隐含的步骤如下:我从之前的一个功能完整的Rails 3.0.7应用程序开始进行修改,最初与mongoid捆绑在一起。 1)将gem'mysql2'(或其他适配器,如sqlite3)添加到Gemfile&运行包 2)添加要求“active_record/railtie”&要求“rails/test_unit/railtie”配置/应用程序。rb 3)添加config/database.yml(与con fi g/mongodb.ym一起生活) – 2011-05-30 17:00:23

+0

...我的理由去多个轨道应用程序(引擎或sinatra端点)处理不同的dbs是:(1)封装更好的维护/升级,(2)最终在其他应用程序中重复使用的模块性,(3)可读性等等。当然,这与简单,但它似乎是最后的胜利! – 2011-05-30 17:14:00