19 августа 2010 г.

MongoDb за 10 минут.

Эта статья затевалась, как общее введение к нереляционным (NOSQL) хранилищам данных, которыми я интересуюсь в последнее время. Вообще я буду излагать основные концепции применения NOSQL в практических проектах, а именно использование MongoDb.
Итак, MongoDb — это документ-ориентированная база данных без схемы данных. Проект «Монго» призван закрыть пробел между хранилищами типа «ключ-значение» и реляционными базами данных, предоставляя богатые возможности выборок и функционала обычных реляционных СУБД.


Проще говоря, MongoDb это супербыстрое персистентное хранилище, скорость доступа к которому сравнима разве что с Memcache, которое предоставляет неограниченные возможности в горизонтальном масштабировании и построении высоконагруженных приложений!
Если необходима большая производительность без существенных вложений средств, быстрая горизонтальная масштабируемость, распределенное хранение данных, простая поддержка репликации — MongoDb это ваш выбор.
Вообще, к теме выбора NOSQL-решения мы ещё вернемся, а сейчас пора заняться делом!

Установка
Отсюда берём дистрибутив. Под Windows следует сразу брать скомпилированные бинарники и распаковать их, например, на диск D:
Далее, следует создать структуру директорий для хранения файлов БД:
mkdir D:\data
mkdir D:\data\db


В директории, куда мы распаковали MongoDb следует выполнить:

cd bin
mongod

Ура! Мы запустили MongoDb Server. Веб-морда, через которую можно проследить состояние сервера доступна на по адресу http://localhost:28017/

Сохраняем данные
Чтобы приступить к опытам над MongoDb, запустим консоль mongo. В директории bin:
mongo

Можно также использовать консоль прямо на сайте MongoDb, нажав по «Try it out»!
Данные в MongoDb хранятся в виде «документов», т.е. в отличие от реляционных СУБД не в виде связей между элементарными объектами-кортежами, а в виде завершенных самостоятельных объектов, которые могут отображать любые структуры данных. В качестве формата такого представления используется BSON. BSON это бинарный вариант формата JSON, который известен в вебе. Для тех, кто не знаком ни с тем ни с другим, рекомендую сначала понять JSON, благо информации об этом формате предостаточно. Очень сильно рекомендую познакомиться с языком программирования Javascript, т.к. именно он используется в качестве языка запросов.

Документы в MongoDb объединяются в так называемые «коллекции». Коллекция это массив произвольных документов.

В реляционных СУБД аналогами этого понятия являются таблицы, а точнее даже сами базы данных, т.к. в них хранятся в виде таблиц различные типы сущностей.

Создадим нашу первую коллекцию, в которой будут складываться анкеты пользователей социальной сети:
db.users.save({name:"Ivan", secondname:"Ivanovich", surname:"Ivanov", login:"ivanov", password:"qwerty", 
birth_date:"1975-08-24"});

db.users.save({name:"Petr", surname:"Petrov", login:"petrov", password:"qwerty", 
birth_date:"1972-09-11"});
db.users.save({name:"Aleksey", surname:"Alekseev", login:"alex135", password:"qwerty", city:"Saint-Petersburg"});


Теперь в нашей базе данных 3 пользователя: Ivanov, который не указал информацию о своём городе, но указал отчество, Petrov, который не указал отчество, и Alekseev, который указал свой город, но не указал ни даты рождения, ни отчества.

О проектировании схемы данных
Как было указано выше, данные в документ-ориентированных базах данных хранятся в виде целых объектов, а не как кортежи со связями через внешние ключи (FOREIGN KEYS), как в реляционных базах.

Рассмотрим это на примере простого интернет-магазина, в котором каждому товару сопоставлен определенный набор свойств, а также множество изображений товара, например с разных ракурсов, в сравнении с эталоном для обозначения размера и т.п.

Даталогическая схема для реляционной СУБД выглядит примерно так.

Однако из-за особенностей реализации MongoDb для хранения такой структуры рекомендуется использовать не связанные, а вложенные объекты, т.е. вот так.

В официальной документации такой подход объясняется тем, что MongoDb загружает объекты в память целиком. В результате, для того, чтобы получить массив изображений товара, следует всего лишь получить объект товара. Если же использовать реляционный подход в MongoDb, то получение массива изображений займёт N+1 запрос, т.е. N запросов на получение каждого объекта типа «Изображение» и получение объекта типа «Товар», что негативно сказывается на производительности.

Получаем данные
Делать запросы к MongoDb даже проще, чем к SQL базе данных. Критерии запроса (WHERE) задаются также в формате JSON. Получим для начала пользователя с логином Ivanov:
db.users.find({"login":"ivanov"});

А теперь получим всех пользователей, родившихся после 06.06.69:
db.users.find({"birth_date":{"$gt":"1969-06-06"}});

Во втором запросе использовался критерий поиска >, который задаётся в виде поля JSON-объекта $gt. Вообще, параметр метода find это объект, описывающий условие WHERE в терминах SQL. Можно создавать и более комплексные запросы:
db.users.find( { $query : { "birth_date" : {"$lt":"1999-09-09", "$gt":"1936-05-02"}}, $orderby : { "login" : 1 } } );

Данный запрос эквивалентен SELECT * FROM `users` WHERE `birth_date`<'1999-09-09' AND `birth_date`>'1936-05-02' ORDER BY `login` ASC;

Кроме того, MongoDb позволяет делать выборки, критериями которых являются значения полей внутри объекта. Но об этом в другой раз.

Заключение
Вы научились добавлять данные в хранилище MongoDb и делать простые выборки, Вы познакомились с принципами проектирования базы данных в MongoDb. Это отличное начало для того, чтобы изучить документацию и приступить к созданию первого приложения на MongoDb. 
MongoDb подкупит Вас хорошей документацией, неплохим сообществом, возможностью заказать платную поддержку. MongoDb создаётся компанией 10gen.
Я присоединюсь чуть позже, а пока рекомендую ознакомиться с полезными ссылками по этой теме:

Отправить комментарий