Вопрос проверяет понимание хранения и обработки JSON-данных в PostgreSQL и умение выбирать подходящий тип.
Тип JSON хранит данные в текстовом виде, а JSONB — в бинарном разобранном формате. JSONB работает быстрее при поиске и поддерживает индексы. JSON сохраняет исходный формат и порядок ключей, а JSONB — нет. В большинстве случаев на практике используют JSONB.
PostgreSQL поддерживает два типа для хранения JSON:
JSON
JSONB
Оба позволяют хранить структурированные данные, но различаются способом хранения и производительностью.
Определение:JSON хранится как текст, практически без обработки.
Особенности:
Сохраняется исходный формат
Сохраняется порядок ключей
Каждое чтение требует повторного разбора
Пример:
INSERT INTO events(data)
VALUES ('{"a":1,"b":2}');
При запросе PostgreSQL заново парсит строку.
Определение:JSONB хранится в бинарном формате, разобранном и оптимизированном для поиска.
Особенности:
Порядок ключей не сохраняется
Дубликаты ключей удаляются
Быстрее поиск и фильтрация
Пример:
INSERT INTO events(data)
VALUES ('{"a":1,"b":2}'::jsonb);
Ключевое преимущество JSONB — возможность индексирования.
Пример:
CREATE INDEX idx_events_data
ON events USING GIN (data);
Это позволяет быстро искать:
SELECT * FROM events
WHERE data @> '{"a":1}';
С JSON такие индексы не работают эффективно.
На практике:
Вставка JSON немного быстрее
Поиск и фильтрация JSONB значительно быстрее
JSONB занимает чуть больше CPU при записи, но выигрывает при чтении
Редкие случаи:
Важно сохранить точный формат документа
Данные почти не читаются и не фильтруются
Чаще всего:
Фильтрация по полям
Индексы
Аналитические запросы
Метаданные
JSON — текстовое хранение для совместимости и точности формата.JSONB — оптимизированное бинарное хранение для поиска, индексов и большинства практических задач, поэтому в реальных системах обычно выбирают именно его.