JSONB операции

Тема дорожной карты · PostgreSQL

Тип jsonb в PostgreSQL хранит данные JSON в декомпозированном двоичном формате, обеспечивающем богатую поддержку операторов и эффективное индексирование — возможности, недоступные для обычного типа json. Оператор -> извлекает поле объекта JSON как значение jsonb, тогда как ->> возвращает то же поле как обычный текст; операторы #> / #>> позволяют перемещаться по вложенным путям с помощью массива ключей в одном SQL-выражении. PostgreSQL также предоставляет операторы вхождения @> («содержит») и <@ («содержится в»), позволяющие проверять, включает ли один документ jsonb пары ключ-значение другого. GIN-индекс по столбцу jsonb значительно ускоряет запросы на вхождение и проверку наличия ключа в больших таблицах реляционной базы данных. Уверенное владение операторами jsonb необходимо для приложений, хранящих полуструктурированные данные в PostgreSQL при сохранении требований к быстрым и выразительным SQL-запросам.

Как это работает

JSONB операции делает Postgres конкурентным document-store. JSONB бинарный, быстрее JSON для запросов, поддерживает GIN-индексы. Операторы: -> (поле как JSON), ->> (как текст), @> (containment), ? (ключ существует), #>> (глубокий путь как текст). jsonb_set/jsonb_insert мутируют; jsonb_agg/jsonb_object_agg агрегируют. GIN-индекс на JSONB-колонке делает containment-запросы быстрыми — обязателен для JSONB-фильтров.

Когда применять

JSONB — для semi-structured данных, форма которых меняется per row (config-блобы, audit-payload, third-party event body). Реляционные колонки + плотная схема — для предсказуемых форм; реляционные запросы в 5-10× быстрее JSONB на тех же данных при известной схеме. Не используйте JSONB как "schema escape hatch" — теряете constraint, foreign key, type-check.

Типичные ошибки

Ловушки JSONB операции: структурированные поля как JSONB "для гибкости" с запросами по каждому пути (нет enforce схемы, планировщик не видит реальную статистику); огромные JSONB-блобы (per-row TOAST), дорогие row update; нет GIN-индекса и жалобы что @> медленно; -> где нужен ->> (получаете JSON-quoted строки, не текст).

Связанные понятия

Полезные ресурсы