назад
13 дек

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