0Pricing
SQL Academy · Урок

JSONB и JSON: когда что использовать

Выбирайте между JSON (текст с сохранением пробелов) и JSONB (двоичный формат с индексированием и устранением дублирующихся ключей) для подходящего способа хранения

«JSONB и JSON: когда что использовать» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Два типа JSON в PostgreSQL

  • JSON — хранит точный текст, который вы передали
  • JSONB — разобранный двоичный формат с устранением дубликатов ключей и поддержкой индексов

JSON: хранение текста

JSON сохраняет пробелы, порядок ключей и дублирующиеся ключи. При каждом чтении выполняется повторный разбор. Индексирование GIN не поддерживается. Для нового кода это почти никогда не лучший выбор.

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB: двоичный формат с поддержкой индексов

JSONB:

  • Хранится в разобранном виде → повторный разбор при чтении не требуется
  • Дублирующиеся ключи объединяются (побеждает последний)
  • Порядок ключей не сохраняется
  • Поддерживает индексирование GIN
  • Поддерживает расширенные операторы путей

Пример JSONB

Простая таблица событий:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

Операторы путей

JSONB предоставляет расширенные операторы (они рассматриваются в следующем уроке):

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

Вхождение

Самый полезный оператор JSONB: @> (содержит).

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

Равенство JSONB

Два значения JSONB равны, если их содержимое совпадает — порядок ключей не имеет значения:

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

Приведение типов

Свободно преобразуйте типы:

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

Когда NOT следует использовать JSONB

Если данные имеют фиксированную структуру, используйте обычные столбцы:

  • Более быстрые запросы (не требуется разбирать документ для каждой строки)
  • Строгая типизация и ограничения
  • Меньший объём хранилища
  • Более точная статистика

JSONB особенно полезен, когда структура меняется или быстро развивается.

Гибридное моделирование

Рекомендуемый подход: структурированные столбцы для стабильных полей, JSONB для переменных дополнительных данных:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

Проверка данных

JSONB хранит любые корректные данные JSON. Для структурных ограничений используйте ограничения CHECK или проверку схемы на уровне приложения:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

Итоги

JSONB лучше JSON почти во всех рабочих сценариях.

  • JSONB: двоичный формат, индексы, быстрые операции с путями
  • JSON: только сохранение и восстановление текста
  • Используйте JSONB для переменной структуры, а обычные столбцы — для фиксированной

Быстрая проверка

Вы проектируете новую таблицу для хранения загруженных пользователями документов JSON, по содержимому которых будут выполняться запросы. Что выбрать: JSON или JSONB?

Часто задаваемые вопросы

Урок «JSONB и JSON: когда что использовать» бесплатный?

Да — полный текст урока «JSONB и JSON: когда что использовать» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «JSONB и JSON: когда что использовать»?

Выбирайте между JSON (текст с сохранением пробелов) и JSONB (двоичный формат с индексированием и устранением дублирующихся ключей) для подходящего способа хранения Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «JSONB и JSON: когда что использовать»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. JSONB и JSON: когда что использовать
  2. Операторы путей: -> ->> @>
  3. Индексация JSONB с помощью GIN
  4. Моделирование: когда JSONB лучше нормализации
← Назад к SQL Academy