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 или ссылочная таблица или CHECKEnum и 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/доменной задаче, чтобы не переписывать через год».


Структура

Раздел растёт волнами:

  1. Типы (текущая волна) — фундамент. Что выбрать на этапе проектирования таблицы.
  2. Индексы и EXPLAIN — что делать, когда запросы тормозят, и как читать план.
  3. Миграции — как менять схему на живой БД.

Каждая волна закрывается отдельным AI-скиллом (ucp-pg-schema-review, ucp-pg-explain-review, ucp-pg-migration-review), который применяет правила из соответствующих статей.