Современные хранилища данных: MongoDB
В большинстве проектов сейчас в качестве основного хранилища данных мы используем MongoDB.
Основные преимущества MongoDB:
Удобство, скорость работы и разработки
Данные в MongoDB - это не "строки в таблице", как в реляционных базах данных, а JSON документы произвольной стуктуры. Вот пример заказа из одного из наших проектов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
{ "_id": ObjectId("50c5bdd9e77989ae3e00008e"), "address_id": ObjectId("50c5be20e77989ab3e0000af"), "bonus_used": 0, "care_call_done": false, "created_at": ISODate("2012-12-10T10: 47: 53.337Z"), "delivery_cents": 20000, "delivery_currency": "RUB", "discount": 0, "gave_bonus": false, "is_paid": false, "line_items": { "0": { "_id": ObjectId("50c5bdd9e77989ae3e000090"), "category_ids": { "0": ObjectId("500493473ffdc46ec9000006") }, "is_sample": false, "item_id": ObjectId("5004938d3ffdc46ec900046a"), "name": 'Да Хун Пао "Большой красный халат"', "qty": 280, "total_cents": 154000, "total_currency": "RUB", "unit": "г", "version": 1 } }, "numbers_invoice": [ ], "password": null, "password_confirmation": null, "payment": "on_recieve", "payment_status": "not_paid", "state": "cart", "sum_cents": 154000, "sum_currency": "RUB", "token": "", "total_cents": 174000, "total_currency": "RUB", "total_without_bonus_cents": 174000, "total_without_bonus_currency": "RUB", "updated_at": ISODate("2012-12-10T10: 49: 04.159Z"), "version": 31 } |
Таким образом, в заказе содержится вся информация о нем, достаточная чтобы отобразить за один запрос страницу checkout, корзину, и т.д. что значительно уменьшает нагрузку на приложение, и увеличивает скорость его работы
MongoDB поддерживает индексацию по любым полям, в т.ч. по вложенным документам, по элементам массивов и т.д.
Поддержка богатого языка документов-запросов - запросы к БД сами являются документами.
1 2 3 4 5 6 7 8 9 10 |
db.bios.find( { awards: { $elemMatch: { award: 'Turing Award', year: { $gt: 1980 } } } } ) |
Быстрые, атомарные неблокирующие обновления - в MongoDB можно хранить статистику посещений страниц сайтов с многими миллионами посещений, и это будет работать быстро.
Автоматический шардинг - в MongoDB горизонтальное масштабирование базы данных легче, чем где либо. Большинство реляционных баз данных неспособны расти дальше, когда нагрузка по записи превышает возможности одного сервера.
Возможность использования Map/Reduce и выполнения JavaScript кода в контексте базы данных, что удобно использовать для построения отчетов, обсчета больших объемов данных и т.д.
Надежность
Поддержка полноценной, быстрой, безглючной, wan-aware репликации данных. В одном из наших проектов 70-гигабайтная база данных реплицируется на удаленный сервер на другом континенте - для гарантии от каких либо проблем.
Поддержка безглючных, беспроблемных горячих бекапов без блокировки записи, за счет журнала операций oplog.
Наличие коммерческой поддержки, которая важна для buisness-critical приложений.
Mongoid
Одним из самых больших преимуществ MongoDB для нас было существование Mongoid - полноценной, функционально богатой, покрытой тестами и надежной ODM-системы для MongoDB и Ruby.
С ним использование MongoDB в Rails очень похоже на использование стандартного Active Record, поддерживает валидации моделей, и прочие нужные вещи, и при этом очень быстро и удобно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Artist include Mongoid::Document field :name, type: String embeds_many :instruments end class Instrument include Mongoid::Document field :name, type: String embedded_in :artist end syd = Artist.where(name: "Syd Vicious").between(age: 18..25).first syd.instruments.create(name: "Bass") syd.with(database: "bands", session: "backup").save! |
Недавно Mongoid обновился до 3-й версии, в которой получил собственный MongoDB драйвер Moped и стал работать ещё быстрее. Сейчас мы переводим все mongodb-проекты, находящиеся у нас на поддержке, на Mongoid 3.