6

我正在寻找更好的方式(又名架构)来拥有不同类型的数据库( MySQL + MongoDB )来支持同一个 Rails 应用程序。

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

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

你认为有可能......有什么想法或建议吗?

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

在此先感谢 Luca G. Soave

4

2 回答 2

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 参考。

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

于 2011-05-29T11:46:15.313 回答
4

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

  1. 您现在在同一个应用程序中使用 mongo 和 MySQL 时遇到什么问题,以及
  2. 使用多个 Rails 应用程序处理不同数据库的原因是什么。

虽然我不是 ruby​​ & 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 提供了很多选项来定义 realtions。像 Belongs_to 关系一样,将引用 ID 存储在子文档中。它与 mongo DbRef 完全相反。当离开 mongo 成语以获得主动记录的感觉时,它非常令人困惑。所以尽量坚持它的文档性质。必要时使用 embed 和 DbRef。(如果我错了,可能有人纠正我)

仍然 Mongoid 是一个伟大的工作。其功能齐全。

于 2011-05-29T15:16:25.087 回答