Как PostgreSQL поддерживает хранение и запросы к данным в формате JSON?

«Как PostgreSQL поддерживает хранение и запросы к данным в формате JSON?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PostgreSQL предоставляет два специализированных типа данных для работы с JSON:

  1. json — хранит точную копию входного текста (с пробелами, порядком ключей).
  2. jsonb (рекомендуется) — хранит данные в разобранном бинарном формате. Он быстрее для обработки запросов, поддерживает индексацию, но не сохраняет незначительные детали форматирования.

Основные операции:

-- Создание таблицы
CREATE TABLE events (
    id BIGSERIAL PRIMARY KEY,
    metadata JSONB NOT NULL
);

-- Вставка данных
INSERT INTO events (metadata) VALUES 
('{"user_id": 101, "action": "login", "device": {"os": "Android", "version": 10}}');

-- Извлечение значений (операторы возвращают jsonb/text)
SELECT metadata -> 'user_id' AS user_id_json,  -- Возвращает число как JSONB: 101
       metadata ->> 'action' AS action_text    -- Возвращает текст: "login"
FROM events;

-- Доступ к вложенным объектам
SELECT metadata #> '{device, os}' AS os_json, -- JSONB: "Android"
       metadata #>> '{device, version}' AS version_text -- TEXT: "10"
FROM events;

-- Поиск и фильтрация
SELECT * FROM events WHERE metadata @> '{"action": "login"}';

-- Создание индекса для ускорения поиска
CREATE INDEX idx_events_metadata ON events USING GIN (metadata);

Почему jsonb лучше: Поддержка индексов (GIN, BTREE) делает запросы по полям JSON чрезвычайно быстрыми, что позволяет эффективно использовать PostgreSQL как гибридную реляционно-документную СУБД.