Rails: смешивание баз данных NOSQL и SQL

Я ищу лучший способ (он же архитектура), чтобы иметь другой вид DBs ( MySQL + MongoDB), бэкендинг того же приложения Rails.

Я спекулировал на главном приложении Rails 3.1, устанавливая двигатели Rails 3.1, связывающие каждый другой вид БД ...

... или иметь главные рельсы 3.0.X App маршрутизация конечной точки sinatra для каждого MySQL / MongoDB istance ...

Как вы думаете, это возможно ... есть идеи или предложения ?

Я замечаю некоторые другие подобные вопросы здесь, но я думаю, что" монтажные приложения " быстро перемещаются в Rails 3.1 / Rack / Sinatra, и нам всем нужно настроить наши парадигмы.

спасибо заранее Лука Г. Соаве

2 ответов


нет необходимости полностью усложнять вещи, запустив два приложения, чтобы иметь два типа базы данных. Похоже, вам нужно DataMapper. Он сделает именно то, что вам нужно из коробки. Получите драгоценный камень dm-rails, чтобы интегрировать его с рельсами.

в DataMapper, в отличие от ActiveRecord, вы должны предоставить все сведения о вашем базовом хранилище данных: какие поля у него есть, как они отображают атрибуты в ваших моделях, каковы имена таблиц (если в база данных), какой бэкэнд он использует и т. д.

читать документацию... там есть ведро кода, чтобы дать вам идею.

каждая модель - это просто старый рубиновый объект. Определение класса просто смешивается в 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 не была такой простой.


Я не совсем понимаю ваш вопрос. как

  1. какова проблема, с которой вы столкнулись прямо сейчас, используя mongo и MySQL в одном приложении, и
  2. в чем причина перехода на несколько rails app, связанных с различными dbs.

хотя я не эксперт в ruby & rails (подобран несколько месяцев назад), я хотел бы добавить что-то здесь.

В настоящее время я создаю приложение rails, использующее как mongo, так и MySQL в задней части. 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 (on rails g mongoid: config - mongoid.YML добавил) все леса, и поколения работает в направлении mongo db. В противном случае каждый раз вам нужно удалить mongoid.yml перед созданием моделей Activerecord
  2. и не используйте mongoid в реляционном смысле. я знаю, что mongoid предоставляет много вариантов для определения отношений. Like Belongs_to отношения хранит refernece id в дочерних документах. Его полная противоположность монго DbRef. Его очень смущает, когда он оставляет идиомы монго в пользу активной записи. Поэтому постарайтесь придерживаться документального характера. При необходимости используйте embed и DbRef. (может быть, кто-то corrcet меня, если я ошибаюсь)

все-таки Монгол-великая работа. Его полностью загружен функциями.