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