Rails:混合使用NOSQL和SQL数据库

问题描述

| 我正在寻找一种更好的方法(又名架构),使不同类型的数据库(MySQL + MongoDB)支持相同的Rails应用程序。 我当时在猜测一个主要的Rails 3.1应用程序,它安装了将Rails 3.1引擎链接在一起的不同类型的数据库... ...或者有一个主要的Rails 3.0.x应用为每个MySQL / MongoDB实例路由一个sinatra端点... 您是否认为有任何想法或建议? 我在这里注意到其他一些类似的问题,但是我认为“安装应用程序”在Rails 3.1 / Rack / Sinatra中正在快速发展,我们都需要调整我们的范例。 提前致谢 卢卡·索韦(Luca G.Soave)     

解决方法

        不必通过运行两个应用程序来拥有两种类型的数据库,就可以完全避免复杂化。听起来您需要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无缝集成并不容易。     ,        我不完全了解您的问题。 您现在在同一应用中使用mongo和MySQL面临的问题是什么,并且 为什么要使用多个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\')
轻而易举。但是,您需要了解一些重要点 在Mongoid模型之前创建Active Record模型。一旦激活了Mongoid(在轨道上添加了g mongoid:config-mongoid.yml),所有的脚手架都可以使用,并且几代人都可以使用mongo db。否则,每次需要在创建Activerecord模型之前删除mongoid.yml时 并且不要以关系方式使用蒙古包。我知道mongoid提供了许多定义实景的选项。像Belongs_to关系一样,将引用ID存储在子文档中。它与mongo DbRef完全相反。当离开mongo惯用语以寻求活跃的录制感觉时,这非常令人困惑。因此,请尝试坚持其文档性质。必要时使用embed和DbRef。 (如果错了,可能有人在咒骂我) Mongoid仍然是伟大的作品。它具有完整的功能。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...