Rails:混合NOSQL和SQL数据库

时间:2011-05-29 11:25:27

标签: sql ruby-on-rails mongodb ruby-on-rails-3.1 nosql

我正在寻找更好的方式(也就是架构)来使用不同类型的数据库(MySQL + MongoDB)来跟踪相同的Rails应用程序。

我在推测一个主要的Rails 3.1应用程序,安装Rails 3.1引擎链接每个不同类型的数据库......

...或者有一个主要的Rails 3.0.x应用程序为每个MySQL / MongoDB提供一个sinatra端点......

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

我在这里注意到其他一些类似的问题,但我认为“挂载应用程序”在Rails 3.1 / Rack / Sinatra中正在快速发展,我们都需要调整我们的范例。

提前致谢 Luca G. Soave

2 个答案:

答案 0 :(得分: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无缝集成并不是那么容易。

答案 1 :(得分:4)

我不完全理解你的问题。比如

  1. 你现在面临的问题是在同一个应用程序中使用mongo和MySQL,
  2. 了解多个rails app处理不同dbs的原因。
  3. 虽然我不是红宝石专家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还有一些用于Geo空间查询的查询模式)

    Item.where(:category => 'car').skip(0).limit(10)
    User.where(:name => 'ram')
    
    这是一件轻而易举的事。但是你需要知道一些重要的要点

    1. 在mongoid模型之前创建Active记录模型。一旦mongoid被激活(在轨道上g mongoid:config - mongoid.yml添加)所有的脚手架,并且几代人朝着mongo db工作。否则,每次在创建Activerecord模型之前需要删除mongoid.yml
    2. 并且不要以关系方式使用mongoid。我知道mongoid提供了许多定义实现的选项。像Belongs_to关系一样,将引用ID存储在子文档中。它与mongo DbRef完全相反。当离开mongo成语以获得积极记录的感觉时,它非常混乱。所以尽量坚持它的文档性质。必要时使用embed和DbRef。 (如果我错了,可能会有人纠结我)
    3. Still Mongoid是一部伟大的作品。它的功能齐全。