Ответ
PostgreSQL предоставляет два специализированных типа данных для работы с JSON:
json— хранит точную копию входного текста (с пробелами, порядком ключей).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 как гибридную реляционно-документную СУБД.