Rails:混合NOSQL和SQL数据库

BBJ*_*BJ3 6 sql ruby-on-rails mongodb nosql ruby-on-rails-3.1

我正在寻找更好的方式(也就是架构)来使用不同类型的DB(MySQL + MongoDB)后端相同的Rails应用程序.

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

...或者有一个主Rails 3.0.x应用程序路由每个MySQL/MongoDB的sinatra端点...

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

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

在此先感谢Luca G. Soave

d11*_*wtq 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
Run Code Online (Sandbox Code Playgroud)

但是你有很多控制权.例如,我可以指定此模型不存储在我的默认数据存储(存储库)中,并且它存储在其他一个配置的数据存储中(如果您愿意,可以存储在NoSQL存储中).

class User
  include DataMapper::Resource

  storage_names[:some_other_repo] = 'whatever'

  # ... SNIP ...
end
Run Code Online (Sandbox Code Playgroud)

大多数情况下,DM在类固醇上表现得像ActiveRecord.您可以获得所有基础知识,例如查找记录(除非您的模型将其抽象出去,否则您永远不必使用原始字段名称):

new_users = User.all(:created_at.gte => 1.week.ago)
Run Code Online (Sandbox Code Playgroud)

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

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