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 picksJSONB: двоичный формат с поддержкой индексов
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 — локальная установка не требуется.
Все уроки этого курса
- JSONB и JSON: когда что использовать
- Операторы путей: -> ->> @>
- Индексация JSONB с помощью GIN
- Моделирование: когда JSONB лучше нормализации