Презентацию к лекции 27 Вы можете скачать здесь.
Документо-ориентированные базы данных
Следующий большой класс — это документо-ориентированные базы данных (Document-Oriented Databases). На первый взгляд их отличие от баз класса «ключ-значение» незаметно, так как они тоже обещают работу с неструктурированными данными и структурами, которые часто меняются.
Однако есть существенная разница: все данные объекта, или документа (Document), хранятся внутри одной ячейки. К ним можно обращаться через языки запросов и стандартные операции баз данных. Это уменьшает количество объединений таблиц (JOIN).
Ключевые особенности:
- Гибкость схемы: Структура документов не должна быть известна заранее и может изменяться динамически. При этом запросы всё равно понимают содержимое документа: если поле есть, можно указать, как к нему обращаться и что из него извлекать.
- Применимость: Такие базы лучше всего подходят для быстрого сохранения и доставки данных в приложениях с динамически изменяющимися схемами объектов.
MongoDB: Особенности реализации
Наиболее известный представитель этого класса — MongoDB.
- Формат хранения: Объекты (документы) хранятся в формате BSON (Binary JSON) — это JSON-структуры, переведенные в двоичный вид для эффективности.
- Организация данных: Документы объединены в коллекции (Collections). В отличие от таблиц в SQL, в одной коллекции могут лежать документы с абсолютно разной структурой.
- Производительность: Файлы базы данных могут быть отображены в памяти (Memory-Mapped Files), что ускоряет работу с ними. Внутренние индексы и операции обработки обеспечивают высокую степень доступности как на запись, так и на чтение.
- Технологии: Ядро MongoDB реализовано на C++, но существуют драйверы и API для множества других языков программирования.
Сравнение подходов к масштабированию
В контексте NoSQL важно различать два подхода к распределению данных: репликацию и шардинг.
Репликация (Replication)
Это копирование данных. Мы создаем копии и поддерживаем их синхронизацию с выделенным мастер-сервером.
- Плюсы: Значительно ускоряет чтение, так как читать можно параллельно с разных копий.
- Минусы: Замедляет запись, поскольку каждое изменение нужно синхронизировать со всеми репликами, что требует ресурсов.
Шардинг (Sharding)
Это разделение данных на части (шарды) и распределение их по разным серверам (дата-нодам).
- Особенности: Нет гарантии, что в каждом узле найдется искомый блок. Для этого используется выделенный сервер (Name Node), который указывает, на каком дата-node лежит нужный блок.
- Плюсы чтения: Чтение остается быстрым, потому что блоки распределены равномерно и считываются параллельно. Однако обращение к Name Node является «узким местом» (bottleneck).
- Плюсы записи: Запись происходит параллельно в разные серверы. Нет необходимости синхронизировать много копий между собой (обычно поддерживается три копии блока).
MongoDB реализует оба механизма: и шардинг, и репликацию. При настройке серверов указывается, является ли узел чистым дата-нодом для шардинга или хранит реплику другого узла.
Пример операций в MongoDB
Два документа с разной структурой и разным набором полей могут спокойно храниться в одной коллекции. Часть полей может совпадать, часть — нет.
Операции над коллекцией работают только с теми документами, в которых присутствуют указанные в запросе поля.
Основные типы операций:
- Вставка документа.
- Поиск одного или нескольких документов.
- Обновление (Update).
- Удаление.
- Явное обновление индекса.
Причины популярности NoSQL
Ключевой фактор — простота. Разработчики, переходя с SQL, понимают, что теряют часть возможностей традиционных баз данных, но сталкиваются с меньшими трудозатратами:
- Не нужно прилагать много усилий для создания структуры хранилища.
- Исчезает «головная боль», связанная с изменением структуры. Если структура данных поменяется, не нужно перестраивать всю базу, терять данные или пересоздавать индексы.
Это также важный психологический фактор: проектировщик не боится ошибиться со схемой. NoSQL базы не требуют задавать структуру заранее и не ограничивают будущие изменения данных.
Краткие итоги
Анализ материала показывает, что развитие баз данных движется в сторону снятия фундаментальных ограничений, накладываемых реляционной моделью на этапе проектирования. Ключевая ценность документо-ориентированных систем заключается не просто в хранении неструктурированных данных, а в переносе ответственности за структуру с администратора базы на само приложение. Это кардинально меняет подход к разработке: вместо долгого этапа моделирования схемы и рисков, связанных с её изменением, команда получает возможность итеративно развивать продукт, модифицируя модель данных без дорогостоящих миграций.
Особое значение имеет то, как MongoDB решает проблему производительности при таком уровне гибкости. Применение отображения файлов в памяти и бинарного формата BSON позволяет нивелировать накладные расходы на интерпретацию структуры, делая скорость работы сопоставимой с более строгими системами. Механизмы масштабирования здесь рассмотрены не как конкурирующие технологии, а как взаимодополняющие инструменты. Понимание разницы между копированием (репликацией) и сегментированием (шардингом) позволяет архитектору точечно настраивать систему: жертвовать скоростью записи ради ускорения чтения или наоборот, балансируя нагрузку в зависимости от бизнес-задач.
Практическая значимость изложенного подхода состоит в том, что он снижает когнитивную нагрузку на разработчика. Устранение необходимости синхронизировать множество таблиц через JOIN-запросы упрощает код и делает логику приложения более прозрачной. В итоге выбор в пользу таких систем — это стратегическое решение об ускорении вывода продукта на рынок и упрощении поддержки кодовой базы за счет отказа от избыточной формализации на уровне хранилища.
Введение в документо-ориентированные БД
Этот класс похож на базы «ключ-значение», так как работает с неструктурированными данными. Главное отличие: данные объекта (документа) хранятся внутри одной ячейки, что уменьшает количество JOIN-ов. Схема документов неизвестна заранее и меняется динамически, но запросы всё равно понимают содержимое документа. Лучшая сфера применения — быстрое сохранение данных для динамичных приложений.
MongoDB
Самый популярный представитель класса.
- Формат: Документы хранятся в бинарном формате BSON (Binary JSON).
- Организация: Документы объединены в коллекции. В одной коллекции могут лежать документы с абсолютно разной структурой.
- Производительность: Файлы БД отображаются в памяти (Memory-Mapped Files), что ускоряет доступ. Ядро написано на C++, есть драйверы для других языков.
Масштабирование: Репликация vs Шардинг
- Репликация (Replication): Копирование данных. Ускоряет чтение, так как данные читаются параллельно с разных копий. Замедляет запись, так как все реплики нужно синхронизировать с мастером.
- Шардинг (Sharding): Распределение данных по частям (блокам). Запись идет параллельно в разные сервера, что ускоряет её. Чтение требует обращения к серверу-координатору (Name Node), который указывает, где лежит нужный блок. Это является узким местом. MongoDB реализует оба механизма.
Операции и гибкость
В одной коллекции документы могут иметь совпадающие и не совпадающие поля. Операции работают только с теми документами, где нужные поля существуют.
Основные операции:
- Вставка (Insert).
- Поиск одного или нескольких (Find).
- Обновление (Update).
- Удаление (Delete).
- Обновление индекса.
Причины популярности
- Простота: Меньше усилий на создание структуры хранилища.
- Психологический фактор: Разработчик не боится ошибиться в схеме. Если данные изменятся, не нужно перестраивать всю БД, терять индексы или части информации. NoSQL базы не ограничивают будущее.
1. Документо-ориентированные БД хранят все данные объекта в одной ячейке, что радикально снижает потребность в JOIN-запросах.
2. Схема данных в MongoDB не фиксируется заранее, что позволяет изменять структуру документов без остановки работы.
3. Документы в MongoDB хранятся в бинарном формате BSON, обеспечивающем высокую скорость обработки.
4. В отличие от реляционных таблиц, документы в одной коллекции могут иметь разную структуру.
5. Репликация данных ускоряет операции чтения за счет параллельного доступа к копиям, но замедляет запись.
6. Шардинг ускоряет запись за счет параллельного распределения данных, но требует обращения к узлу-координатору (Name Node).
7. MongoDB поддерживает оба механизма масштабирования, позволяя гибко настраивать кластер.
8. Использование памяти для отображения файлов значительно повышает производительность операций с данными.
9. Основной мотивацией перехода на NoSQL является снятие ограничений и снижение трудозатрат на проектирование схемы.
10. Гибкая структура данных позволяет разработчикам избегать сложных миграций при изменении требований к приложению.
1. Чем принципиально отличается хранение данных в документо-ориентированной БД от реляционной при работе со сложными объектами?
2. Почему формат BSON лучше подходит для внутреннего представления данных, чем текстовый JSON?
3. Что позволяет делать наличие Name Node в архитектуре шардинга?
4. Каким образом репликация влияет на производительность операций чтения и записи?
5. В чем разница между понятиями «реплика» и «шард» в контексте MongoDB?
6. Какие типовые операции поддерживаются при работе с документами в коллекции?
7. Почему NoSQL базы снимают «головную боль» у проектировщиков при изменении структуры данных?
8. Может ли внутри одной коллекции MongoDB существовать два документа с полностью разным набором полей?
9. Каким образом технология Memory-Mapped Files ускоряет работу MongoDB?
10. Что произойдет, если выполнить запрос к полю, которое отсутствует в части документов коллекции?