Документоориентированная база данных
Документоориентированная база данных (англ. document-oriented database) — это тип нереляционной (NoSQL) базы данных, предназначенный для хранения, извлечения и управления данными, представленными в виде документов. В отличие от реляционных баз данных, использующих таблицы, строки и столбцы, документоориентированные базы данных оперируют самодостаточными, слабоструктурированными или полуструктурированными документами, обычно в форматах JSON, BSON, XML или YAML. Каждый документ является независимой единицей, содержащей как данные, так и их метаописание (схему), что обеспечивает гибкость схемы данных и упрощает работу с объектами реального мира.
История
Предпосылки появления
К началу 2000-х годов реляционные базы данных (РБД) доминировали в корпоративной среде. Однако рост масштабов веб-приложений, появление социальных сетей и необходимость обработки больших объёмов неструктурированных данных выявили ограничения реляционной модели: жёсткая схема, сложность горизонтального масштабирования, неэффективность при работе с иерархическими данными (например, вложенными объектами JSON). Это привело к поиску альтернатив, получивших общее название NoSQL.
Развитие
Первые документоориентированные системы начали появляться в середине 2000-х годов. В 2005 году компания Google опубликовала статью о Bigtable, а в 2007 году — о MapReduce, что стимулировало развитие распределённых хранилищ. В 2007 году была выпущена система CouchDB, созданная Дэмианом Кацем и Яном Лейном, которая стала одной из первых документоориентированных баз данных с открытым исходным кодом, использующей JSON и HTTP-интерфейс. В 2009 году компания 10gen (ныне MongoDB Inc.) выпустила MongoDB, которая быстро завоевала популярность благодаря простоте использования, масштабируемости и поддержке вложенных документов. В 2010-х годах появились другие заметные системы: Amazon DynamoDB (проприетарная, от Amazon Web Services), Couchbase (на основе CouchDB и Membase), OrientDB (гибридная, с поддержкой графовой модели) и RethinkDB. К концу 2010-х годов документоориентированные базы данных стали стандартом для многих современных веб-приложений, микросервисных архитектур и систем управления контентом.
Классификация
Документоориентированные базы данных можно классифицировать по нескольким признакам.
По формату хранения документов
- JSON-ориентированные (MongoDB, CouchDB, Couchbase): используют JSON как основной формат или его бинарный вариант BSON. JSON является де-факто стандартом для веб-API.
- XML-ориентированные (BaseX, eXist-db): хранят данные в формате XML. Часто используются в системах, где XML является основным форматом обмена данными (например, в издательском деле или финансовой сфере).
- Смешанные (OrientDB, ArangoDB): поддерживают несколько форматов, но обычно основным является JSON.
По модели хранения
- Чистые документоориентированные (MongoDB, CouchDB): хранят только документы, без поддержки других моделей данных (например, графов или ключ-значение).
- Гибридные (OrientDB, ArangoDB, Cosmos DB): поддерживают несколько моделей данных (документную, графовую, ключ-значение, иногда реляционную) в одной системе.
По способу размещения
- Локальные (MongoDB, CouchDB): устанавливаются на собственные серверы или в облачные инфраструктуры.
- Облачные (DBaaS) (Amazon DynamoDB, Azure Cosmos DB, Google Firestore): предоставляются как управляемый сервис в облаке.
Устройство и характеристики
Основные понятия
- Документ — основная единица хранения. Представляет собой набор пар «ключ-значение», где значения могут быть простыми (строка, число, булево), массивами или вложенными документами. Документ не обязан соответствовать заранее определённой схеме; разные документы в одной коллекции могут иметь разные поля.
- Коллекция — группа документов (аналог таблицы в РБД, но без жёсткой схемы). В некоторых системах (например, CouchDB) коллекции называются «базами данных».
- Ключ документа — уникальный идентификатор (обычно строка или ObjectID), по которому документ извлекается. Часто генерируется автоматически.
- Индексы — структуры, ускоряющие поиск по полям документов. Поддерживаются первичные (по ключу) и вторичные (по произвольным полям) индексы.
Модель данных
Документоориентированная модель является денормализованной по своей природе: данные, которые в реляционной модели потребовали бы нескольких таблиц и JOIN-запросов, часто хранятся в одном документе в виде вложенных структур. Например, заказ с товарами может быть представлен как один документ, содержащий массив позиций заказа. Это упрощает чтение данных, но может привести к дублированию (избыточности) при обновлении.
Запросы
Запросы к документам выполняются с помощью специализированных языков запросов, которые обычно не являются SQL. Примеры:
- MongoDB Query Language (MQL): использует JSON-подобный синтаксис для фильтрации, проекции, сортировки и агрегации.
- CouchDB MapReduce: использует функции на JavaScript для построения индексов и выполнения запросов.
- Couchbase N1QL: язык запросов, похожий на SQL, но адаптированный для работы с JSON-документами.
ACID-транзакции
Многие ранние документоориентированные базы данных (например, MongoDB до версии 4.0) не поддерживали многооперационные транзакции с гарантиями ACID (атомарность, согласованность, изоляция, долговечность) на уровне нескольких документов. Вместо этого они гарантировали атомарность только на уровне одного документа. Начиная с версии 4.0 (2018 год), MongoDB добавила поддержку многодокументных транзакций. Другие системы, такие как Amazon DynamoDB, также имеют ограниченную поддержку транзакций.
Масштабирование
Документоориентированные базы данных обычно проектируются для горизонтального масштабирования (шардирования). Данные распределяются по нескольким серверам (шардам) на основе ключа шардирования (например, по диапазону значений поля или по хешу). Это позволяет обрабатывать большие объёмы данных и высокие нагрузки. Репликация (создание копий данных на разных серверах) обеспечивает отказоустойчивость.
Применение
Документоориентированные базы данных находят применение в широком спектре задач, где требуется гибкая схема, быстрая разработка и работа с иерархическими данными.
Системы управления контентом (CMS)
Хранение статей, страниц, блогов, пользовательских профилей и метаданных. Каждый документ может содержать произвольный набор полей, что удобно для контента с разной структурой.
Интернет-магазины и каталоги
Хранение товаров с различными характеристиками (цвет, размер, вес, технические параметры). В реляционной модели потребовалось бы много таблиц для каждого типа характеристик; в документоориентированной — один документ на товар.
Аналитика и журналирование
Хранение логов, событий, метрик. Документы могут быть записаны в базу данных в реальном времени, а затем обработаны с помощью агрегационных запросов.
Мобильные и веб-приложения
Хранение пользовательских сессий, настроек, данных о действиях. JSON-документы легко сериализуются и десериализуются в объекты JavaScript, что упрощает интеграцию с фронтендом.
Интернет вещей (IoT)
Хранение данных от датчиков, устройств, сенсоров. Каждое устройство может генерировать документы с разной структурой, что хорошо подходит для документоориентированной модели.
Примеры
MongoDB
Одна из самых популярных документоориентированных баз данных. Использует BSON (бинарный JSON) для хранения, поддерживает шардирование, репликацию, полнотекстовый поиск, агрегационный фреймворк и многодокументные транзакции. Имеет драйверы для большинства языков программирования.
CouchDB
База данных, ориентированная на веб-технологии. Хранит документы в JSON, использует HTTP-интерфейс для всех операций (RESTful API). Поддерживает репликацию между узлами (multi-master) и конфликты, которые разрешаются пользователем. Отличается высокой надёжностью и простотой развёртывания.
Amazon DynamoDB
Управляемый сервис от Amazon Web Services (AWS). Является документоориентированной и key-value базой данных одновременно. Поддерживает автоматическое масштабирование, шифрование, резервное копирование. Использует собственный формат хранения и язык запросов (PartiQL). Отличается высокой производительностью при работе с ключами.
Azure Cosmos DB
Управляемый сервис от Microsoft Azure. Поддерживает несколько моделей данных (документную, графовую, табличную, key-value). Использует собственный протокол (SQL API) для запросов к JSON-документам. Обеспечивает глобальное распределение и многомодельность.
Критика
Несмотря на широкое распространение, документоориентированные базы данных имеют ряд недостатков.
- Отсутствие стандартизации. В отличие от SQL, не существует единого языка запросов. Каждая система имеет свой синтаксис и возможности, что затрудняет миграцию между ними.
- Проблемы с целостностью данных. Из-за денормализации и отсутствия встроенных механизмов ссылочной целостности (аналогов внешних ключей) разработчики должны самостоятельно обеспечивать согласованность данных на уровне приложения.
- Сложность сложных запросов. Для выполнения запросов, требующих соединения данных из разных коллекций (аналог JOIN), часто требуется несколько запросов или использование агрегационных фреймворков, что может быть менее эффективно, чем в РБД.
- Избыточность данных. Денормализация приводит к дублированию данных, что увеличивает объём хранилища и может усложнить обновление.
- Ограниченная поддержка транзакций. Хотя современные системы (MongoDB, DynamoDB) добавили поддержку многодокументных транзакций, они часто имеют более низкую производительность и ограничения по сравнению с реляционными СУБД.
Источники
- Cattell, R. (2011). Scalable SQL and NoSQL data stores. ACM SIGMOD Record.
- MongoDB Documentation. (2024). MongoDB Manual.
- CouchDB Documentation. (2024). Apache CouchDB Reference.
- Amazon DynamoDB Documentation. (2024). Developer Guide.
- Azure Cosmos DB Documentation. (2024). Introduction to Azure Cosmos DB.
- Hecht, R., & Jablonski, S. (2011). NoSQL evaluation: A use case oriented survey. International Conference on Cloud and Service Computing.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →