MongoDB

MongoDB — это документоориентированная система управления базами данных, которая не требует описания схемы таблиц. Считается одним из классических примеров NoSQL-систем, использует JSON-подобные документы и схему базы данных. Написана на языке C++.

Логотип MongoDB

MongoDB имеет открытый исходный код, она бесплатная и доступна любому разработчику. СУБД подходит для операционных систем семейства Linux, Windows и macOS. Ей можно пользоваться в облаке. Название читается как «Монго-ДБ».

Кто пользуется MongoDB

  • Бэкенд-разработчики веб-приложений и сайтов. В основном СУБД MongoDB используется в веб-программировании.
  • Специалисты в области Big Data и аналитики, которые работают с большим количеством не связанной друг с другом информации.
  • Разработчики в стартапах, где четко не определена структура хранения данных — в любой момент может потребоваться ее изменение.
  • DevOps-инженеры — иногда знание MongoDB может быть необходимо при работе с инфраструктурой проекта.

Для чего нужна MongoDB

  • Хранение данных, которые не жестко связаны между собой.
  • Управление данными: создание новых записей, их редактирование, удаление, контроль версий.
  • Получение данных с помощью запросов без использования SQL.
  • Отправка транзакций — последовательностей из нескольких запросов, которые выполняются один за другим.
  • Быстрый, удобный и простой доступ к данным.
  • Контроль доступа и поддержки безопасности данных.
  • Выдача прав разным категориям пользователей.
  • Поддержка базы в актуальном состоянии, в том числе при одновременном доступе с нескольких клиентов.

Отличие от реляционных баз данных

В реляционной базе данных информация представлена как набор связанных между собой таблиц. Доступ к данным осуществляется с помощью запросов на языке SQL. Реляционная модель — традиционная, ее используют чаще всего. Но для многих задач она неоптимальна, например, если связи между разными данными не жесткие.

В MongoDB реализована система, при которой данные хранятся в «табличных» документах форматов, близких к JSON. Информация записывается в виде пар из ключей и значений — как в таблице, в которой есть идентификаторы и соответствующие им данные. Благодаря такому формату в MongoDB можно разместить очень разнообразную и сложно структурированную информацию: документ — более гибкая структура.

При работе с такими базами SQL не используется, отсюда название NoSQL. Вместо него применяют языки программирования. В случае с MongoDB это JavaScript. Существуют драйверы для поддержки других популярных языков: Python, Java, C/C++, Go, PHP, Ruby и прочих.

Читайте также: SQL, R или Python: какой язык учить аналитику данных?

Как устроено хранение данных в MongoDB

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

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

Поле. Это одна запись в документе, если точнее, один ключ, метка, которой соответствует определенный набор данных. Понятие можно сравнить со столбцом в таблице реляционной базы. Например, если документ описывает данные о нескольких собаках, то в нем могут быть поля «Порода», «Кличка», «Возраст» и другие.

Описанный выше идентификатор — одно из полей, которые есть в документе, причем обязательное.

Документ. Один документ — это файл в формате BSON: название расшифровывается как binary JSON, или бинарный JSON. Отличие от стандартного JSON в том, что формат работает еще быстрее, но файлы в нем занимают меньше места.

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

Максимальный размер документа — 16 Мб. Для сохранения данных большего размера используется технология GridFS, о которой мы поговорим ниже.

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

Встроенный документ. В базах данных, которые управляются SQL, есть операция JOIN, объединяющая между собой сведения из разных таблиц. В MongoDB другая структура: обычно все находится внутри одной коллекции, а операции JOIN не предусмотрено. Для связей и разделений используются встроенные документы — структуры встраиваются друг в друга.

База данных. Так называется общее хранилище, где находятся коллекции, в которых, соответственно, расположены документы. У баз в MongoDB есть интересная особенность: когда база создана, но в нее ничего не записано, она де-факто не существует. Это отличает ее от пустых реляционных баз, которые существуют, даже если в них ничего нет.

Особенности MongoDB

Индексация. Данные внутри базы можно индексировать — так система быстрее найдет к ним доступ. Для данных создаются индексы, специальные объекты, которые хранят указатели на ту или иную информацию: обычно это конкретные значения и ссылки на них. Благодаря индексам можно реализовать поиск по базе, он не будет выглядеть как простой перебор всех данных. Это ускоряет работу системы.

Репликация. Так называется возможность работы с репликами — копиями базы данных. Можно иметь несколько связанных друг с другом копий БД на разных серверах, и одна из них будет главной, а остальные — вспомогательными. Изменения сначала будут вноситься в главную базу, а потом передаваться другим. В итоге, если с основной копией что-то случится, любая существующая реплика сможет ее заменить — так в системе поддерживается стабильность. Замена происходит автоматически.

Сегментирование. Репликация — не единственный способ хранить базу MongoDB на разных серверах. Система поддерживает сегментирование, то есть разделение базы данных на отдельные сегменты и их распределение по разным серверам. Это позволяет балансировать нагрузку на мощности. Принцип разбиения определяет администратор, поэтому распределение по разным частям серверного кластера тоже можно спланировать.

Запросы ad hoc. Латинские слова означают «специально для этого», поэтому такие запросы еще называют специальными. Одна из особенностей MongoDB — гибкая поддержка разнообразных запросов. СУБД принимает запросы на поиск по разным полям, работает с функциями JavaScript и может возвращать пользовательские функции в ответ на запрос. Она поддерживает регулярные выражения. MongoDB позволяет получить в качестве ответа диапазон или случайное значение — запросы могут быть в том числе очень сложными.

Grid File System. Сокращенно эта технология называется GridFS, мы упоминали ее выше. Речь шла о том, что максимальный размер документа в MongoDB — 16 Мб, а технология применяется, если нужно сохранить в базу более объемные данные. По сути, это то же сегментирование, но в рамках документа. Массивные данные хранятся в двух коллекциях: files и chunks:

  • files — коллекция, в которой находятся сведения о файлах. Это их имена и метаданные, содержащие информацию об объеме и других параметрах;
  • chunks — коллекция, где хранятся сами файлы, но не целиком, а разбитые на небольшие сегменты. Размер каждого сегмента обычно 256 Кб, но эта цифра может меняться.

Благодаря такому разделению на маленькие составные части в базе можно хранить даже очень большие файлы. Это позволяет обойти максимальный размер документа в 16 Мб.

Преимущества MongoDB

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

Гибкость. MongoDB позволяет хранить разнородные данные, поэтому она гибкая и легко адаптируется под разнообразные задачи. Например, если информация не укладывается в общую структуру или собирается разными способами и сильно различается, MongoDB все равно позволит успешно хранить ее и получать доступ.

Легкая масштабируемость. Причина, по которой MongoDB пользуются стартапы и небольшие компании, — возможность быстро и легко масштабировать систему. Если информация в базе должна измениться, например, планируется добавить новое поле, не нужно радикально перекраивать структуру всей БД. Это возможно благодаря документно-ориентированной модели и особому формату данных.

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

Возможность работы на нескольких серверах. Это возможно благодаря механизмам репликации и сегментирования. Первый позволяет создавать работающие копии базы, которым в любой момент можно передать управление; второй помогает грамотно распределять нагрузку. Такие возможности делают работу системы стабильнее и снижают риск отказа базы в важный момент.

Недостатки MongoDB

Отсутствие хранимых процедур и функций. Хранимые процедуры — это возможность реляционных баз данных: разработчик один раз пишет набор команд на языке SQL, сохраняет его, а потом может вызвать в любой момент. Получается подобие скрипта, который выполняется по команде. Поддержка хранимых процедур в MongoDB не предусмотрена, и это не дает в полной мере автоматизировать работу с БД.

Пользовательские функции, или UDF, похожи на хранимые процедуры, но различаются особенностями сохранения и вызова. Их можно реализовать самостоятельно — функции, написанные на JavaScript, сохраняются с помощью специальной команды и позднее используются снова. Правда, это сложнее, чем возможность работать с ними «из коробки».

Неполное соответствие ACID. ACID — это набор принципов для баз данных, соответствие которым делает систему стабильной и предсказуемой. Принципов всего четыре: атомарность, согласованность, изолированность, устойчивость. MongoDB, в отличие от распространенных реляционных СУБД, соответствует им не полностью. До версии 4.0 система не отвечала требованиям атомарности — они требуют, чтобы никакая транзакция не «зависала» в системе завершенной не до конца. В более поздних версиях это исправили.

Сложности с транзакциями. Документно-ориентированный подход дает много плюсов, но из-за него сначала было затруднительно работать с транзакциями. В старых версиях их ACID-реализации не было, поэтому многие считали, что при NoSQL-подходе транзакции отсутствуют в принципе. Позже они появились, но работа по-прежнему имеет специфику.

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

Как начать работу с MongoDB

  1. Скачать MongoDB на официальном сайте проекта, где компания представляет СУБД и другие решения, в том числе коммерческие. Можно воспользоваться официальным репозиторием MongoDB на GitHub или пакетным менеджером. В macOS это brew, в Linux — apt-get и другие.
  2. Скачать MongoShell — шелл-оболочку, которая позволяет отдавать команды. Она скачивается отдельно и тоже есть на официальном сайте.
  3. Установить MongoDB и шелл-оболочку на сервер, где будет храниться база. В реальных проектах обычно это арендованные на хостингах мощности. Создать тестовую базу данных для тренировки можно и на собственном устройстве.

Взаимодействие с базой обычно происходит через терминал. Можно подключить модули для поддержки разных языков программирования, но по умолчанию язык запросов для MongoDB — это JavaScript. Операторы, с помощью которых управляют базой данных MongoDB, основаны на нем.

Освойте новую профессию

(рейтинг: 4.5, голосов: 6)
Добавить комментарий