Документо-ориентированная СУБД
Документо-ориентированная СУБД (англ. Document-oriented database) — это нереляционная система управления базами данных (NoSQL), предназначенная для хранения, извлечения и управления данными, организованными в виде документов. В отличие от реляционных СУБД, где информация хранится в строках и столбцах таблиц со строго определённой схемой, документо-ориентированные базы данных работают с полуструктурированными данными, обычно в форматах JSON, BSON, XML или YAML. Каждый документ представляет собой автономную единицу, содержащую данные в виде пар «ключ-значение», и может иметь собственную, отличную от других документов структуру (схему). Ключевой особенностью является отсутствие необходимости в предварительном определении схемы данных (schema-less), что обеспечивает высокую гибкость при разработке и масштабировании.
История
Концепция документо-ориентированных баз данных возникла как ответ на ограничения реляционной модели, особенно в контексте веб-приложений и работы с большими объёмами слабоструктурированных данных. Первые коммерческие продукты, такие как Lotus Notes (1989 год), использовали документную модель для хранения электронной почты и совместной работы, но не были широко распространены как СУБД общего назначения.
Современный этап развития начался в середине 2000-х годов с ростом популярности NoSQL-движения. Ключевые проекты этого периода:
- CouchDB (2005 год) — одна из первых документо-ориентированных СУБД с открытым исходным кодом, использующая JSON для хранения и JavaScript для запросов.
- MongoDB (2009 год) — наиболее популярная на сегодняшний день документо-ориентированная СУБД, использующая бинарный формат BSON (Binary JSON). Она стала стандартом де-факто для многих веб-приложений.
- Amazon DynamoDB (2012 год) — полностью управляемый сервис NoSQL от Amazon Web Services (AWS), поддерживающий как документную, так и ключ-значение модели.
В 2010-х годах документо-ориентированные СУБД стали основой для многих современных архитектур, включая микросервисы и бессерверные вычисления.
Основные характеристики
Модель данных
Данные хранятся в виде документов. Документ — это набор полей (атрибутов), каждое из которых может содержать значение простого типа (строка, число, булево значение), массив или вложенный документ. Пример документа в формате JSON:
``json { "_id": "12345", "name": "Иван Петров", "age": 30, "address": { "city": "Москва", "street": "Тверская" }, "hobbies": ["чтение", "плавание"] } ``
Отсутствие фиксированной схемы
В отличие от реляционных таблиц, документы в одной коллекции могут иметь разный набор полей. Это позволяет легко добавлять новые атрибуты без изменения существующих записей и без миграции схемы.
Вложенность и денормализация
Документы могут содержать вложенные структуры (вложенные документы, массивы), что позволяет хранить связанные данные в одном месте. Это снижает необходимость в операциях JOIN, характерных для реляционных СУБД, и повышает производительность чтения.
Идентификатор документа
Каждый документ имеет уникальный идентификатор (_id), который обычно генерируется автоматически (например, ObjectId в MongoDB) или задаётся пользователем. Этот идентификатор служит первичным ключом.
Индексация
Для ускорения поиска по полям документов используются индексы. Можно создавать индексы на любые поля, включая вложенные. Индексы могут быть простыми (по одному полю) или составными (по нескольким полям).
Классификация
Документо-ориентированные СУБД можно классифицировать по нескольким признакам:
По способу хранения
- Чисто документные — хранят данные в виде документов (MongoDB, CouchDB).
- Гибридные — поддерживают как документную, так и другие модели (например, реляционную или графовую) (ArangoDB, OrientDB).
По типу используемого формата
- JSON/BSON — MongoDB, CouchDB, RethinkDB.
- XML — eXist-db, MarkLogic.
- YAML — редко используется как основной формат, но поддерживается некоторыми СУБД.
По способу развёртывания
- Локальные (on-premise) — устанавливаются на собственные серверы (MongoDB Community Server, CouchDB).
- Облачные (DBaaS) — предоставляются как управляемый сервис (MongoDB Atlas, Amazon DynamoDB, Azure Cosmos DB).
Устройство и архитектура
Хранение данных
Документы обычно группируются в коллекции (аналог таблиц в реляционных СУБД). Коллекции могут быть организованы в базы данных. Внутреннее хранение может быть организовано с использованием B-деревьев, LSM-деревьев (Log-Structured Merge-tree) или других структур данных, оптимизированных для работы с документами.
Язык запросов
В отличие от SQL, который является стандартом для реляционных СУБД, документо-ориентированные системы используют собственные API или языки запросов. Наиболее распространённые:
- MongoDB Query Language (MQL) — основан на JSON, позволяет выполнять фильтрацию, проекцию, сортировку, агрегацию (через pipeline).
- CouchDB — использует представления (views) на основе JavaScript-функций map/reduce.
- DynamoDB — использует API на основе HTTP/HTTPS с JSON-запросами.
Масштабирование
Документо-ориентированные СУБД, как правило, легче масштабируются горизонтально (sharding), чем реляционные. Данные распределяются по нескольким серверам (шардам) на основе ключа шардирования (например, по диапазону значений _id). Это позволяет обрабатывать большие объёмы данных и высокие нагрузки.
Согласованность
В распределённых системах часто используется модель итоговой согласованности (eventual consistency), хотя многие системы (например, MongoDB) позволяют настроить уровень согласованности (read concern, write concern).
Применение
Документо-ориентированные СУБД широко используются в различных областях, где требуется гибкость, быстрая разработка и работа с полуструктурированными данными:
- Веб-приложения и CMS — хранение контента, пользовательских профилей, блогов, комментариев.
- Интернет вещей (IoT) — сбор и хранение данных с датчиков, где структура данных может меняться.
- Аналитика в реальном времени — обработка логов, событий, потоковых данных.
- Мобильные приложения — синхронизация данных между клиентом и сервером (например, CouchDB с PouchDB).
- Каталоги товаров — хранение товаров с разными наборами характеристик (например, в электронной коммерции).
- Игровая индустрия — хранение игровых профилей, достижений, внутриигровых предметов.
Примеры документо-ориентированных СУБД
| Название | Разработчик | Формат хранения | Язык запросов | Лицензия |
|---|---|---|---|---|
| MongoDB | MongoDB Inc. | BSON | MQL | SSPL (с 2018) |
| CouchDB | Apache Software Foundation | JSON | JavaScript (MapReduce) | Apache 2.0 |
| Amazon DynamoDB | Amazon Web Services | JSON | API (HTTP/JSON) | Проприетарная |
| Azure Cosmos DB | Microsoft | JSON, BSON | SQL, MongoDB API, Gremlin | Проприетарная |
| ArangoDB | ArangoDB GmbH | JSON | AQL (ArangoDB Query Language) | Apache 2.0 |
| RethinkDB | The Linux Foundation | JSON | ReQL (ReQL) | Apache 2.0 |
| OrientDB | OrientDB Ltd. | JSON | SQL, Gremlin | Apache 2.0 |
Преимущества и недостатки
Преимущества
- Гибкость схемы — возможность быстро изменять структуру данных без миграций.
- Производительность чтения — за счёт денормализации и вложенности данных снижается количество операций JOIN.
- Горизонтальное масштабирование — более простое, чем в реляционных СУБД.
- Быстрая разработка — соответствие объектно-ориентированным языкам программирования (данные в JSON легко преобразуются в объекты).
- Полуструктурированные данные — хорошо подходят для данных с переменной структурой (логи, профили, каталоги).
Недостатки
- Проблемы с целостностью данных — отсутствие внешних ключей и транзакций ACID (в большинстве систем) может привести к несогласованности данных.
- Сложность сложных запросов — многодокументные транзакции и сложные агрегации могут быть менее эффективными, чем в реляционных СУБД.
- Избыточность данных — денормализация приводит к дублированию данных, что увеличивает объём хранилища.
- Отсутствие стандарта — разные СУБД используют разные API и языки запросов, что усложняет миграцию.
Критика
Документо-ориентированные СУБД критикуются за недостаточную поддержку транзакций ACID (Atomicity, Consistency, Isolation, Durability) в ранних версиях. Однако современные системы (например, MongoDB с версии 4.0) поддерживают многодокументные транзакции, что частично снимает эту проблему. Также критикуется отсутствие единого стандарта, что приводит к vendor lock-in (зависимости от конкретного поставщика).
См. также
- NoSQL
- Реляционная база данных
- Ключ-значение СУБД
- Графовая база данных
- JSON
Источники
- Cattell, R. (2011). Scalable SQL and NoSQL data stores. ACM SIGMOD Record.
- Stonebraker, M. (2010). SQL databases v. NoSQL databases. Communications of the ACM.
- Документация MongoDB, CouchDB, Amazon DynamoDB.
- Hecht, R., & Jablonski, S. (2011). NoSQL evaluation: A use case oriented survey.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →