Современные хранилища данных: 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.