2011-05-29 107 views
6

我正在尋找更好的方法(又名架構)來擁有不同種類的數據庫(MySQL + MongoDB)後端相同的Rails應用程序。Rails:混合NOSQL和SQL數據庫

我在主樑猜測3.1應用程序,安裝導軌3.1引擎鏈接的每個不同類型的DB的...

...或具有主Rails的3.0.x的應用程序的路由每個端點西納特拉MySQL/MongoDB istance ...

你認爲這是可能的......,任何想法或建議?

我注意到其他一些類似的問題,但我認爲「安裝應用程序」在Rails 3.1/Rack/Sinatra中快速移動,我們都需要調整我們的範例。

在此先感謝 盧卡G.索阿韋

回答

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

缺點是什麼?那麼,許多寶石並沒有考慮到你可能沒有使用ActiveRecord,所以當你需要一些寶石時,有更多的搜索要做。不過隨着時間的推移,這會變得更好,因爲在Rails 3.x將DM與Rails無縫集成之前並不那麼容易。

+0

...你能更具體嗎?我的意思是,我真的很舒服,mongoid,從Rails的角度來看也是如此。無論如何,我們還需要管理MySQL數據庫,以響應相同的應用程序。提前致謝。 – 2011-05-29 11:57:09

+0

看到我的更新,並閱讀文檔...它都在那裏。內置多個數據庫/無SQL /無論你如何支持。 – d11wtq 2011-05-29 12:14:30

+0

這裏是DataMapper的MongoDB適配器:https://github.com/solnic/dm-mongo-adapter – d11wtq 2011-05-29 12:18:25

4

我沒有完全理解你的問題。像

  1. 什麼是你面對現在使用蒙戈和MySQL在相同的應用程序的問題,
  2. 什麼換去多Rails應用程序處理不同DBS的原因。

儘管我不是紅寶石專家& 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提供了很多選項來定義實現。就像Belongs_to關係一樣,將參考ID存儲在子文檔中。它與mongo DbRef完全相反。當離開mongo習語爲有利的記錄感覺時,它非常混亂。所以儘量堅持它的文檔性質。必要時使用嵌入和DbRef。 (可能有人corrcet我如果我錯了)

仍然Mongoid是一個偉大的工作。它充滿了功能。

+0

是的,看起來實際上它工作正常......有一些隱含的步驟如下:我從之前的一個功能完整的Rails 3.0.7應用程序開始進行修改,最初與mongoid捆綁在一起。 1)將gem'mysql2'(或其他適配器,如sqlite3)添加到Gemfile&運行包 2)添加要求「active_record/railtie」&要求「rails/test_unit/railtie」配置/應用程序。rb 3)添加config/database.yml(與con fi g/mongodb.ym一起生活) – 2011-05-30 17:00:23

+0

...我的理由去多個軌道應用程序(引擎或sinatra端點)處理不同的dbs是:(1)封裝更好的維護/升級,(2)最終在其他應用程序中重複使用的模塊性,(3)可讀性等等。當然,這與簡單,但它似乎是最後的勝利! – 2011-05-30 17:14:00