0Pricing
SQL Academy · Урок

Моделирование: когда JSONB лучше нормализации

Выбирайте между столбцом JSONB и отдельной таблицей — гибкими атрибутами и строгими схемами

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

Выбор

Для каждого фрагмента данных, который вы можете хранить, нужно выбрать: столбец или ключ JSONB? От этого зависят проектирование схемы, производительность запросов и удобство сопровождения.

Когда лучше использовать столбцы

Используйте обычные столбцы, если данные:

  • Известны и стабильны
  • Часто запрашиваются с использованием индексов
  • Проверяются ограничениями CHECK и FK
  • Используются в отчётах или объединениях

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

Используйте JSONB, если:

  • Структура различается для разных строк (поля, определяемые арендатором, метаданные подключаемых модулей)
  • Схема быстро развивается (чтобы избежать миграций)
  • Обычно читается или записывается весь документ целиком
  • Хранятся непрозрачные данные (тела вебхуков)

Гибридный шаблон

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

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

Ловушка EAV

Классическая модель «сущность — атрибут — значение» — одна таблица со строками вида (ключ, значение) — раньше была единственным выбором для разреженных данных. JSONB заменяет EAV одним столбцом документа:

-- Old EAV:
CREATE TABLE user_attrs (
  user_id BIGINT,
  attr TEXT,
  val TEXT
);

-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';

-- JSONB queries are faster and easier than the EAV joins.

Стратегия миграции

Добавление столбца в активно используемую таблицу → 5 минут простоя для большой таблицы. С JSONB добавление поля — это всего лишь изменение кода приложения.

Ограничения для JSONB

Добавляйте ограничения CHECK, чтобы обеспечить минимальную структуру:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
  ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');

Вынесение часто используемых полей

Если к полю JSONB начинают часто обращаться в запросах, вынесите его в обычный столбец. Скрипт UPDATE, новый индекс и новый столбец сделают работу с ним быстрой.

Операции частичного изменения JSONB

Обновите одно поле:

UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;

Не храните деньги в JSONB

Для финансовых значений требуются точные типы NUMERIC и ограничения. Всегда используйте обычные столбцы.

Когда JSONB мешает

Если вы извлекаете и приводите к типу один и тот же ключ JSONB в каждом запросе, это признак того, что его следует сделать столбцом. Совокупные затраты на (data->>'k')::INT для миллионов строк становятся значительными.

Документирование схемы

Столбцы JSONB легко записывать, но сложно документировать. Поддерживайте внешнюю схему (JSON Schema, код приложения), чтобы другие разработчики знали, чего ожидать.

Итоги

JSONB — мощный инструмент: используйте его для переменных частей, а обычные столбцы — для стабильной основы. Выносите часто используемые поля в столбцы, когда появляются устойчивые шаблоны использования.

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

Вы храните события аудита. Тип события присутствует всегда, а некоторые события содержат массив «акторов», структура которого может различаться. Как Вы смоделируете эти данные?

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

Урок «Моделирование: когда JSONB лучше нормализации» бесплатный?

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

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

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

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

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

Сколько времени занимает урок «Моделирование: когда JSONB лучше нормализации»?

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

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

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

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

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