Открыть сервис

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-80x02
Embedded documentВложенный документ (объект)0x03
ArrayМассив0x04
Binary dataПроизвольные бинарные данные0x05
ObjectId12-байтовый уникальный идентификатор0x07
BooleanЛогическое значение true/false (1 байт)0x08
UTC datetimeДата и время в формате UTC (миллисекунды с эпохи Unix)0x09
NullПустое значение0x0A
Regular expressionРегулярное выражение0x0B
JavaScript codeКод JavaScript0x0D
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 →