BSON
BSON — это формат сериализации данных, основанный на двоичном (бинарном) представлении. Он расшифровывается как Binary JSON (двоичный JSON) и предназначен для хранения и обмена структурированными данными, подобно текстовому формату JSON, но с более компактным и быстрым для машинной обработки представлением. BSON был разработан как основной формат хранения данных в документо-ориентированной системе управления базами данных MongoDB.
История
Формат BSON был впервые разработан компанией MongoDB Inc. (тогда — 10gen) в 2009 году. Целью создания формата было обеспечение более эффективной сериализации и десериализации данных, чем это возможно с помощью текстового JSON. В отличие от текстового формата, BSON использует упорядоченные типы данных и позволяет хранить размер полей заранее, что ускоряет операции поиска и обновления.
Первое формальное описание спецификации BSON появилось вместе с выходом MongoDB 1.0 в том же 2009 году. В 2017 году спецификация BSON была опубликована на сайте bsonspec.org, и с тех пор формат поддерживается сообществом и развивается как открытый стандарт.
Классификация
BSON является форматом сериализации данных и относится к классу двоичных протоколов обмена. В отличие от текстовых форматов (JSON, YAML, XML), он не предназначен для удобочитаемости человеком без специальных инструментов. BSON также не является реляционной базой данных или языком запросов — это лишь способ представления информации.
Устройство и характеристики
Принцип кодирования
BSON документ представляет собой последовательность байтов, организованную следующим образом:
- В начале документа указывается его общая длина (4 байта, целое число в формате little-endian).
- Затем следует последовательность элементов. Каждый элемент включает:
- Тип данных (1 байт).
- Имя поля (строка, заканчивающаяся нулевым байтом).
- Значение (размер и структура зависят от типа).
- В конце документа ставится нулевой байт (терминатор).
Поддерживаемые типы данных
BSON поддерживает больше типов данных, чем JSON. Основные из них:
| Тип | Описание | Код типа |
|---|---|---|
| Double | Число с плавающей запятой двойной точности (IEEE 754) | 0x01 |
| UTF-8 string | Строка в кодировке UTF-8 | 0x02 |
| Embedded document | Вложенный документ (объект) | 0x03 |
| Array | Массив | 0x04 |
| Binary data | Произвольные бинарные данные | 0x05 |
| ObjectId | 12-байтовый уникальный идентификатор | 0x07 |
| Boolean | Логическое значение true/false (1 байт) | 0x08 |
| UTC datetime | Дата и время в формате UTC (миллисекунды с эпохи Unix) | 0x09 |
| Null | Пустое значение | 0x0A |
| Regular expression | Регулярное выражение | 0x0B |
| JavaScript code | Код JavaScript | 0x0D |
| 32-bit integer | Целое число со знаком (32 бита) | 0x10 |
| 64-bit integer | Целое число со знаком (64 бита) | 0x12 |
| Decimal128 | Десятичное число с плавающей запятой (128 бит, IEEE 754-2008) | 0x13 |
Размеры
Каждый элемент в BSON имеет заголовок, который содержит тип поля и его имя. Это делает BSON несколько избыточным по сравнению с чисто бинарными форматами (например, Protocol Buffers), но упрощает разбор и позволяет обновлять структуру данных без перекомпиляции.
Средняя эффективность сжатия BSON по сравнению с текстовым JSON составляет примерно 20–30% экономии объёма (за счёт двоичного представления чисел и отсутствия лишних символов). Однако для строк небольшой длины (например, коротких имён полей) BSON может быть избыточнее из-за обязательного включения имени поля в каждый элемент.
Применение
BSON используется в первую очередь в СУБД MongoDB, где он является нативным форматом хранения документов и протоколом взаимодействия между клиентом и сервером. Каждый документ, хранящийся в коллекции MongoDB, фактически представляет собой BSON-объект.
Области применения BSON:
- Базы данных: основной формат в MongoDB. Внутреннее хранение документов и драйверы (C, C++, C#, Go, Java, JavaScript, Perl, Python, Ruby, Scala, Swift и др.) автоматически преобразуют данные из BSON в родные типы языка.
- Сетевые протоколы: BSON используется в протоколе Wire Protocol MongoDB для передачи запросов и ответов между клиентом и сервером.
- Хранение файлов: формат GridFS в MongoDB разбивает большие файлы на чанки, каждый из которых хранится как отдельный BSON-документ.
- Инструменты анализа данных: библиотеки для работы с BSON используются в обработке логов, системах распределённых вычислений (например, Apache Spark имеет модуль для чтения BSON).
- Веб-разработка: благодаря поддержке JavaScript BSON может быть легко интерпретирован в Node.js-приложениях.
Пример конвертации JSON → BSON
Исходный JSON: ``json { "name": "Иван", "age": 30, "active": true, "skills": ["Python", "MongoDB"], "address": { "city": "Москва" } } `` После сериализации в BSON этот документ будет иметь общий размер порядка 70–80 байтов (в зависимости от длины имён полей), в то время как текстовый JSON занимает примерно 100–120 байтов в кодировке UTF-8.
Критика
BSON не лишён недостатков. Основные критические замечания:
- Избыточность заголовков: каждое имя поля повторяется в каждом документе, что при большом количестве однотипных документов приводит к значительно́му перерасходу места (фактор, решённый в MongoDB через сжатие данных на уровне ядра WiredTiger со сжатием snappy или zlib).
- Сложность вложенных структур: вложенные объекты и массивы обрабатываются дольше, чем в плоских структурах данных.
- Отсутствие стандартной поддержки: BSON не является универсальным стандартом, подобно JSON или Avro. Его поддержка в сторонних инструментах ограничена (хотя библиотеки существуют для многих языков).
- Производительность: из-за переменной длины строк и отсутствия схемы (schema-less) десериализация может быть медленнее, чем в строго типизированных форматах (Protocol Buffers, Thrift).
Интересные факты
- Название BSON не является строго точным: хотя формат и основан на JSON, он поддерживает не только JSON-совместимые типы, но и дополнительные (например, Date или ObjectId).
- MongoDB использует BSON как внутренний формат и как протокол передачи, что позволяет избежать двойной конвертации (JSON→BSON→JSON).
- Система ObjectId в BSON (тип
0x07) представляет собой 12-байтовое значение, которое включает временную метку (4 байта), идентификатор машины (3 байта), идентификатор процесса (2 байта) и счётчик (3 байта). Это делает его уникальным в пределах одной машины в одну секунду. - BSON используется не только в MongoDB. Например, в проекте Apache CouchDB (NoSQL база данных) существует библиотека для чтения/записи BSON на Python.
- Спецификация BSON является открытой и может быть реализована без лицензионных отчислений.
Источники
- Спецификация BSON (bsonspec.org)
- Документация MongoDB: «Data Formats — BSON»
- Статья «BSON» на сайте MongoDB Inc.
- «MongoDB: The Definitive Guide» / К. Чодо, М. ДиРольф, Э. Кац — O'Reilly Media, 2013, 3-е издание (глава «Data Types»)
- Документация Apache Spark по BSON Data Source
- RFC для объектного типа ObjectId (MongoDB Driver Documentation)
- Публикации в рамках конференций NoSQL (2010–2015) по сравнению производительности BSON, JSON и Protocol Buffers
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →