【问题标题】:Rails: mixing NOSQL & SQL DatabasesRails:混合 NOSQL 和 SQL 数据库
【发布时间】:2011-05-29 11:25:26
【问题描述】:

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

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

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

您认为这可能吗……有什么想法或建议吗?

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

提前致谢 卢卡·G·索阿夫

【问题讨论】:

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


    【解决方案1】:

    没有必要为了拥有两种类型的数据库而运行两个应用程序而使事情变得过于复杂。听起来你需要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 无缝集成并不是那么容易。

    【讨论】:

    • ...你能更具体一点吗?我的意思是,我实际上对 mongoid 很满意,从 Rails 的角度来看,它也是如此。无论如何,我们也需要管理一个 MySQL 数据库,以响应同一个应用程序。提前致谢。
    • 查看我的更新,并阅读文档......它就在那里。内置多数据库/no-SQL/任何你喜欢的支持。
    • 这里是 DataMapper 的 MongoDB 适配器:github.com/solnic/dm-mongo-adapter
    • ... 看起来很有希望,但我有点担心 Rails 3.1 中较少采用“dm”,这将成为未来 gem 集成、维护和社区支持的问题。我还发现有人同时在使用 active record 和 mongoid (tinyurl.com/3bo7zbc),但我还在四处寻找。
    • 以前从来没有在 Rails 中使用过 DataMapper,无论如何,在这个 DB-MIX RDBMS/NoSQL 案例中,看起来更干净,可读性更强,我会试一试。谢谢
    【解决方案2】:

    我不完全理解你的问题。,喜欢

    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。 (如果我错了,可能有人纠正我)

    Still Mongoid 是一部很棒的作品。它功能齐全。

    【讨论】:

    • 是的,似乎它确实有效......,隐含的一些步骤如下:我进行了修改,从以前的功能齐全的 Rails 3.0.7 应用程序开始,首先与 mongoid 捆绑. 1) 将 gem 'mysql2' (或其他适配器,如 sqlite3) 添加到 Gemfile 并运行 bundle 2) 添加 require "active_record/railtie" & require "rails/test_unit/railtie" 到 config/application.rb 3) 添加 config/database. yml(与 config/mongodb.ym 一起生活)
    • ...我使用多个 Rails 应用程序(引擎或 sinatra 端点)处理不同数据库的原因是:(1)封装以更好地维护/升级,(2)模块化以最终在其他应用程序中重用, (3) 可读性等。当然这是与简单的对比,但它似乎是最后的胜利!
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2023-04-05
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2022-11-14
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多