Gymterview
junior

Что такое JSONB в PostgreSQL и чем он отличается от JSON?

PostgreSQL поддерживает два типа для хранения JSON-данных: json (текстовое хранение «как есть») и jsonb (бинарное декомпозированное хранение с индексированием). В подавляющем большинстве случаев следует использовать jsonb.

JSON

  • Хранит данные как текстовую строку
  • Сохраняет форматирование, порядок ключей, дубликаты ключей
  • При каждом обращении данные парсятся заново
  • Нельзя индексировать

JSONB

  • Хранит данные в бинарном декомпозированном формате
  • Не сохраняет порядок ключей и пробелы, убирает дубликаты ключей
  • Не требует повторного парсинга — быстрее чтение
  • Поддерживает индексирование (GIN)
  • Поддерживает операторы проверки вхождения (@>, <@, ?, ?|, ?&)
Пример
CREATE TABLE client_settings (
    client_id bigint PRIMARY KEY,
    settings jsonb NOT NULL DEFAULT '{}'
);

INSERT INTO client_settings VALUES
(1, '{"theme": "dark", "notifications": {"email": true, "sms": false}, "limits": [1000, 5000, 10000]}');

Когда использовать JSONB

  • Для хранения полуструктурированных данных с изменяемой схемой
  • Для данных, приходящих из внешних API (ответы от платёжных систем, настройки)
  • Для хранения расширяемых атрибутов (EAV-паттерн)
  • Для метаданных и конфигураций

Когда НЕ использовать JSONB

  • Если структура данных стабильна и известна — лучше обычные столбцы
  • Если нужны JOIN, FOREIGN KEY, агрегации по полям — реляционная модель эффективнее
  • Если данные регулярно обновляются по отдельным ключам — UPDATE всего JSONB-поля дороже, чем обновление столбца

На собеседовании: частая ошибка — сказать «JSONB быстрее JSON». Уточните: JSONB быстрее при чтении и поиске, но медленнее при записи (из-за парсинга в бинарный формат). Главное преимущество — возможность индексирования (GIN) и операторов проверки вхождения.