Выбор ключей и типов
Выбирайте между первичными ключами BIGSERIAL и UUID, решайте, что использовать — TEXT или VARCHAR(n), — и подбирайте подходящий тип для каждого столбца
«Выбор ключей и типов» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Выбор первичного ключа
Три практических варианта:
- BIGSERIAL — монотонно возрастающее 64-битное целое число
- UUID — глобально уникальное 128-битное значение
- Естественный ключ — идентификатор из реального мира (электронная почта, ISBN)
Когда выигрывает BIGSERIAL
Вариант по умолчанию для большинства приложений:
- Малый размер (8 байт), быстрый индекс, эффективно использует кэш
- Монотонность → новые данные группируются в конце индекса
- Удобно читать в URL (например,
/posts/42)
Когда выигрывает UUID
Выбирайте UUID, если:
- Вам нужны глобально уникальные идентификаторы (несколько центров обработки данных, приложения с работой без подключения)
- Вы не хотите раскрывать объём бизнеса через идентификаторы в URL
- Вы хотите сгенерировать идентификатор на стороне клиента до выполнения вставки
Цена — 16 байт (против 8 у BIGINT), а UUID версии 4 рандомизируют вставки в индексе.
Почему естественные ключи рискованны
Адреса электронной почты меняются. Артикулы переименовываются. Коды стран разделяются. Используйте суррогатный ключ как PK, а для естественного ключа задайте ограничение UNIQUE.
Типы столбцов: строки
Для большинства текстовых столбцов:
VARCHAR(n)— когда есть жёсткая верхняя граница (адреса электронной почты, коды)TEXT— для свободного текста и длинного содержимогоCITEXT— когда сравнение всегда должно быть без учёта регистра (например, для адресов электронной почты)
Типы столбцов: числа
Для числовых столбцов:
BIGINT— для идентификаторов и счётчиковNUMERIC(p, s)— для денежных значенийREAL/DOUBLE PRECISION— только для научных вычислений
Типы столбцов: время
Для столбцов времени:
TIMESTAMPTZ— для событий (по умолчанию)DATE— для календарных дат (дни рождения, праздники)TIME— для времени суток без даты (часы работы магазина)
Логическое значение или статус
Если у столбца в будущем может быть больше двух состояний, лучше использовать текстовый статус с CHECK, а не логическое значение:
-- Will probably grow:
status TEXT NOT NULL CHECK (status IN ('draft','published','archived'))
-- vs the trap of "is_published BOOLEAN" when you later need a third state.Сопутствующие ограничения
Каждый столбец должен иметь:
- Наиболее узкий подходящий тип
NOT NULL, если NULL не имеет отдельного смыслаDEFAULT, если столбец обычно содержит одно и то же значениеCHECK, если существует правило предметной области- Индекс, если столбец используется в WHERE/JOIN/ORDER
Последствия для хранения
Узкие типы = меньшие строки = больше строк на странице = выше доля попаданий в кэш. Замена TEXT на VARCHAR(20) не экономит место (хранение одинаково). Замена BIGINT на INT вдвое уменьшает ширину столбца.
Типы внешних ключей должны совпадать
Типы столбца внешнего ключа и столбца PK, на который он ссылается, должны полностью совпадать:
-- Wrong (silently won't use the index efficiently):
user_id INT REFERENCES users(id) -- where users.id is BIGINT
-- Right:
user_id BIGINT REFERENCES users(id)Итоги
Выбор типа — это часть проектирования.
- BIGSERIAL или UUID для PK
- NUMERIC для денежных значений
- TIMESTAMPTZ для событий
- TEXT с CHECK для изменяющегося статуса
- NOT NULL по умолчанию
Проверка знаний
Вы храните время событий для пользователей из разных часовых поясов. Какой тип выбрать?
Часто задаваемые вопросы
Урок «Выбор ключей и типов» бесплатный?
Да — полный текст урока «Выбор ключей и типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выбор ключей и типов»?
Выбирайте между первичными ключами BIGSERIAL и UUID, решайте, что использовать — TEXT или VARCHAR(n), — и подбирайте подходящий тип для каждого столбца Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Выбор ключей и типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Моделирование блога: пользователи, публикации, комментарии
- Выбор ключей и типов
- Индексы для распространённых запросов
- Заполнение базы данных тестовыми данными