Переключение с SQl на MongoDB в Rails 3 - PullRequest
2 голосов
/ 25 августа 2011

Я рассматриваю возможность переключения довольно большого приложения (Rails 3.0.10) с нашей базы данных SQL (SQLite и Postgres) на MongoDB. Я планирую поместить в него все, в основном строку utf-8, двоичный файл и пользовательские данные. (Возможно также небольшой полнотекстовый поиск) У меня сложные отношения (веб-структура: категории, теги, переводы ..., также полиморфные), и я чувствую, что философия MongoDB заключается в том, чтобы этого избежать и поместить все в большой документ, я прав?

Кто-нибудь имеет опыт работы с MongoDB в Rails? В частности, переключение приложения с ActiveRecord на Mongoid? Как вы думаете, это хорошая идея? Знаете ли вы руководство / статью по изучению способа организации сложных данных MongoDB?

ps. В MongoDB мне особенно нравится свобода благодаря своей архитектуре и ориентации на производительность. Это моя главная личная мотивация, чтобы рассмотреть возможность перехода.

Ответы [ 3 ]

9 голосов
/ 25 августа 2011

Я использую mongodb с mongoid, в течение 5-6 месяцев.Также работали с postgres + AR, MySQL + AR.У вас нет опыта переключения AR на mongoid.

Вы сталкиваетесь с проблемами производительности или ожидаете их появления в ближайшее время?Если нет, то я бы посоветовал избежать переключения, так как решение, похоже, основано на факторе крутости Mongodb.

У них обоих есть свои плюсы и минусы, мне нравится скорость mongodb, но есть много ограничений на то, что вы можете сделать, чтобы достичь этого (например, нет соединений, нет поддержки транзакций и медленное поле против поля (updated_at)> создал_ат) запросы).

Если есть проблемы с производительностью, я все равно рекомендую придерживаться текущей системы, так как переключение может быть большой задачей, и было бы лучше, если бы вы потратили половину времени на оптимизацию текущей системы.После прочтения вопроса у меня возникает ощущение, что вы никогда раньше не работали с mongodb, есть много вещей, которые могут вас укусить, и вы не будете полностью осведомлены о том, как их решить.

Однако, если вы все еще настаиваете на переключении, вам необходимо тщательно оценить структуру данных и способ их запроса.В реляционной базе данных у вас есть нормальные формы, у которых есть преимущество в том, что с какой бы структурой вы ни начинали, вы примерно достигнете того же конечного результата после нормализации.В mongodb есть практически неограниченные способы моделирования ваших документов.Вам нужно тщательно смоделировать свои документы, чтобы воспользоваться преимуществами mongodb.Запросы, которые вам нужно выполнить, играют очень важную роль в вашей структуризации наряду с фактическими данными, которые вы хотите сохранить.

Имейте в виду, у вас нет соединений в mongodb (может быть смягчено при хорошем моделировании).На данный момент у вас не может быть запросов типа field1 = field2, т. Е. Вы не можете сравнивать поля, но должны предоставить литерал для запроса.

Посмотрите на этот вопрос: Эффективный способхранить данные в MongoDB: встроенные документы против отдельных документов .Кто-то указывает ОП на обсуждение, где рекомендуются внедренные документы, но в довольно сходном сценарии ОП предпочитает использовать автономные документы из-за характера запросов, которые он будет использовать для извлечения данных.

ВсеЯ хочу сказать, что это должно быть обоснованное решение, которое должно быть принято после того, как вы полностью смоделируете свою систему с помощью mongodb, проведете несколько тестов производительности с некоторыми реальными данными, чтобы увидеть, решит ли mongodb вашу проблему и не должны ли они основываться на факторе крутости.

ОБНОВЛЕНИЕ :

Вы можете сделать field1 = field2, используя предложение $where, но это медленно и рекомендуется избегать.

3 голосов
/ 20 апреля 2012

В настоящее время мы переключаемся с PostgreSQL, tsearch и PostGIS на производственное приложение.Это был сложный процесс, если не сказать больше.Наша модель данных лучше подходит для mongodb, потому что нам не нужно делать сложные объединения.Мы можем очень легко смоделировать наши данные в структуре вложенных документов, предоставляемых mongodb.

Мы запустили зеркальный сайт с изменениями в mongodb, чтобы мы могли оставить производственный сайт в покое, в то время как мы спотыкаемся в процессе.Я не хочу вас пугать, потому что, в конце концов, мы будем рады, что сделали это - но это много работы.Я бы согласился с ответом от rubish: будьте в курсе и принимайте решение, которое вы считаете лучшим.Не основывайте это на факторе «крутизны».

Если вам необходимо изменить, вот несколько советов из нашего опыта:

  • ElasticSearch хорошо подходит для структуры документов mongo, чтобы заменить PostgreSQLРасширения полнотекстового поиска tsearch.
    • Также имеется отличная поддержка географической индексации на основе точек.(Достопримечательности, расположенные ближе или в пределах x миль / километров)
  • Мы используем встроенный в GridFS Mongo для хранения файлов, что прекрасно работает.Это упрощает обмен предоставленными пользователями изображениями и файлами на нашем кластере серверов.
  • Мы используем задачи rake для выгрузки данных из postgresql в формат yaml.Затем у нас есть еще одна задача rake на зеркальном сайте, которая импортирует и преобразует данные в модели, хранящиеся в mongodb.
    • Экспорт / импорт данных может работать с использованием общей базы данных Redis, повторного запуска с обеих сторон и наблюдателя в производственном приложении для регистрации изменений по мере их возникновения.

Мы используем Mongoid в качестве нашего ODM, и в наших моделях есть много областей, которые необходимо переписать для работы с Mongoid против ActiveRecord.

В целом, мы очень довольны MongoDB.Это дает нам гораздо больше гибкости в том, как мы моделируем наши данные.Хотелось бы, чтобы мы открыли его до начала проекта.

0 голосов
/ 08 февраля 2013

пропустить активную запись,

В качестве альтернативы, если вы уже создали свое приложение, взгляните на config / application.rb и измените первые строки из этого:

требуется "rails / all"

к этому: требует "action_controller / railtie" требует "action_mailer / railtie" требует "active_resource / railtie" требуется "rails / test_unit / railtie"

Также важно убедиться, что ссылка на active_record в блоке генератора закомментирована:

Настройка значений генераторов. Доступно много других опций, обязательно ознакомьтесь с документацией.

# config.generators do |g|
#   g.orm             :active_record
#   g.template_engine :erb
#   g.test_framework  :test_unit, :fixture => true
# end

На момент написания этой статьи он по умолчанию закомментирован, поэтому вам, вероятно, здесь не нужно ничего менять.

Надеюсь, вам будет полезно переключить приложение с AR на mongo.

Спасибо.

...