Rails: смешивание баз данных NOSQL и SQL - PullRequest
6 голосов
/ 29 мая 2011

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

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

... или наличие основного приложения Rails 3.0.x, маршрутизирующего конечную точку sinatra для каждого экземпляра MySQL / MongoDB ...

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

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

Заранее спасибо Лука Дж. Соаве

Ответы [ 2 ]

10 голосов
/ 29 мая 2011

Нет необходимости полностью усложнять ситуацию, запустив два приложения, просто чтобы иметь два типа базы данных.Похоже, вам нужно DataMapper .Он будет делать именно то, что вам нужно из коробки.Получите гем dm-rails для его интеграции с 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 запросов), отложенная загрузка больших полей текста / больших двоичных объектов, поддержка нескольких репозиториев.Логика запросов намного лучше, чем AR, на мой взгляд.Просто прочитайте документы.Они дружелюбны к человеку.Не просто справка по API.

В чем недостаток?Ну, во многих драгоценных камнях не учитывается, что вы, возможно, не используете ActiveRecord, так что есть немного больше поиска, когда вам нужен драгоценный камень для чего-то.Однако со временем это станет лучше, поскольку до Rails 3.x бесшовная интеграция DM с Rails не была такой простой.

4 голосов
/ 29 мая 2011

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

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

Хотя я не эксперт в 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 есть некоторые дополнительные шаблоны запросов для пространственного вида запросов Geo)

Item.where(:category => 'car').skip(0).limit(10)
User.where(:name => 'ram')

Это бриз. Но есть некоторые важные моменты, которые вам нужно знать

  1. Создайте свои модели Active record перед моделями mongoid. Как только mongoid активирован (на рельсах g mongoid: config - mongoid.yml добавлен) все строительные леса и поколения работают в направлении mongo db. В противном случае каждый раз, когда вам нужно удалить mongoid.yml перед созданием моделей Activerecord
  2. И не используйте монгоид реляционным образом. Я знаю, что Mongoid предоставляет множество возможностей для определения реалий. Как и отношения Belongs_to, хранит идентификаторы ссылок в дочерних документах. Это совершенно противоположно монго DbRef. Это сильно сбивает с толку, когда вы оставляете идиомы Монго в пользу ощущения активной записи. Поэтому постарайтесь придерживаться природы документа. При необходимости используйте embed и DbRef. (может быть кто-то исправит меня, если я не прав)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...