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) и операторов проверки вхождения.