PostgreSQL
PostgreSQL для прикладного бэкенда: какие типы брать, как проектировать индексы, читать EXPLAIN и катить миграции без даунтайма. С кодами правил для AI-ревью.
Раздел собран из боевых решений, которые повторяются от сервиса к сервису: какой тип взять для денег, почему timestamp без зоны взрывается через полгода, чем uuid v7 лучше uuid v4 для btree-индекса, когда jsonb оправдан, а когда — флаг плохой схемы.
Каждое правило снабжено кодом (PG-T-001, PG-I-002, PG-M-003...) — на эти коды ссылаются скиллы при ревью схемы, миграций и планов запросов:
PG-T-*— типы (Types)PG-I-*— индексы (Indexes)PG-M-*— миграции (Migrations)PG-E-*— EXPLAIN / runtime
Куда идти за конкретным вопросом
| Вопрос | Статья |
|---|---|
| Какой тип взять для денег / id / счётчика | Числа и точность |
text или varchar(n), нужна ли длина | Строки |
timestamp или timestamptz, как работают зоны | Время и таймзоны |
| UUID v4 или v7, почему случайные UUID — больно | UUID и идентификаторы |
PG enum или ссылочная таблица или CHECK | Enum и boolean |
Когда jsonb оправдан, когда нет | JSONB |
| Массив или отдельная таблица; интервалы и непересечения | Массивы и range-типы |
| Что точно делать не надо | Антипаттерны |
Контекст применения
Подразумевается стек:
- PostgreSQL 14+ (часть рецептов работает только начиная с 12 или 14 — будет помечено).
- Java 21 + Spring Boot 3 + jOOQ как persistence-слой (почему jOOQ, а не JPA — отдельная тема).
- Liquibase как инструмент миграций (
db/changelog/*.xmlили*.sql), но рецепты применимы к Flyway и сырому SQL.
Раздел не пытается заменить документацию PostgreSQL — он отвечает на «что брать в типичной CRUD/доменной задаче, чтобы не переписывать через год».
Структура
Раздел растёт волнами:
- Типы (текущая волна) — фундамент. Что выбрать на этапе проектирования таблицы.
- Индексы и EXPLAIN — что делать, когда запросы тормозят, и как читать план.
- Миграции — как менять схему на живой БД.
Каждая волна закрывается отдельным AI-скиллом (ucp-pg-schema-review, ucp-pg-explain-review, ucp-pg-migration-review), который применяет правила из соответствующих статей.