我正在寻找更好的方式(也称为架构)来让不同类型的数据库(MySQL + MongoDB)支持同一个 Rails 应用程序。
我在推测一个主要的 Rails 3.1 应用程序,安装 Rails 3.1 引擎链接每个不同类型的 DB ...
...或者有一个主要的 Rails 3.0.x 应用程序为每个 MySQL/MongoDB 实例路由一个 sinatra 端点...
您认为这可能吗……有什么想法或建议吗?
我注意到其他一些类似的问题,但我认为“安装应用程序”在 Rails 3.1/Rack/Sinatra 中发展迅速,我们都需要调整我们的范例。
提前致谢 卢卡·G·索阿夫
最佳答案
没有必要为了拥有两种类型的数据库而运行两个应用程序而使事情变得过于复杂。听起来你需要 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 引用。
有什么缺点?好吧,许多 gem 没有考虑到您可能没有使用 ActiveRecord,因此当您需要 gem 来做某事时,需要做更多的搜索。不过随着时间的推移,这会变得更好,因为在 Rails 3.x 之前,将 DM 与 Rails 无缝集成并不是那么容易。
关于sql - rails : mixing NOSQL & SQL Databases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6167489/
相关文章:
node.js - Mongoose 更新 : $inc is not working in ups
node.js - Mongoose 得到 `TypeError: user.save is not
node.js - 我可以使用 MongoDb 驱动程序从 node.js 调用 rs.initia
python - 如何摆脱 mongodb 中的光标 id 错误?
java - 如何在 Morphia/MongoDB Java 中创建复合唯一索引?
mongodb - Mongotemplate - 根据大于(gt)或小于(lt)运算符查询Obje
c# - 从 2.0 MongoDb c# 驱动程序获取结果