⚙️ Что это
PostgreSQL Patterns — это шпаргалка для разработчика по эффективной работе с PostgreSQL. Она охватывает основные сценарии: оптимизацию запросов, проектирование схемы, выбор индексов и типов данных, а также быструю настройку безопасности (RLS). Навык не делает ревью кода, а предоставляет готовые шаблоны и чек-листы, которые можно применить прямо сейчас. Основан на лучших практиках Supabase.
🧠 Как работает
Навык сгруппирован по ключевым аспектам работы с БД. В каждом разделе — краткая справка с примерами.
📇 Типы индексов
Для каждого популярного паттерна запросов указан подходящий тип индекса. Например: B-tree для равенства и диапазонов, GIN для jsonb и полнотекстового поиска, BRIN для временных рядов.
-- B-tree для WHERE col = value
CREATE INDEX idx ON t (col);
-- GIN для jsonb @> '{}'
CREATE INDEX idx ON t USING gin (col);
-- BRIN для time-series диапазонов
CREATE INDEX idx ON t USING brin (col);
🏗️ Типы данных
Таблица «какой тип использовать». Рекомендации: bigint вместо int для ID, text вместо varchar(255), timestamptz вместо timestamp, numeric(10,2) для денег.
🔨 Распространённые паттерны
Здесь собраны готовые конструкции SQL для типовых задач:
- Составной индекс: столбцы равенства — первыми, затем столбцы диапазона.
- Покрывающий индекс: добавляет
INCLUDE, чтобы избежать обращения к таблице.
- Частичный индекс: фильтр
WHERE deleted_at IS NULL — индекс только для активных записей.
- RLS-политика: обёрнутая в
SELECT (auth.uid()) — наиболее производительный вариант.
- UPSERT:
INSERT ... ON CONFLICT DO UPDATE — удобная вставка или обновление.
- Курсорная пагинация:
WHERE id > $last_id ORDER BY id LIMIT 20 — O(1) вместо O(n) у OFFSET.
- Очередь задач: атомарное извлечение записи через
FOR UPDATE SKIP LOCKED.
🔍 Обнаружение антипаттернов
Несколько запросов для быстрой диагностики:
-- Найти нендексированные внешние ключи
SELECT conrelid::regclass, a.attname
FROM pg_constraint c
JOIN pg_attribute a ...
WHERE c.contype = 'f'
AND NOT EXISTS (...);
-- Найти медленные запросы (требует pg_stat_statements)
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
WHERE mean_exec_time > 100;
-- Проверить раздутие таблиц (bloat)
SELECT relname, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000;
⚙️ Конфигурация
Быстрый старт для настройки сервера: max_connections, work_mem, таймауты (statement_timeout, idle_in_transaction_session_timeout), отзыв прав на public схему.
🧪 Когда использовать
Этот навык полезен каждый раз, когда вы пишете SQL, проектируете схему или пытаетесь понять, почему запрос работает медленно. Конкретные сценарии:
- Написание SQL-запросов — чтобы не изобретать велосипед.
- Проектирование схем БД — правильный выбор типов данных и индексов.
- Оптимизация медленных запросов — антипаттерны и варианты индексов.
- Внедрение Row Level Security — готовый шаблон политики.
- Настройка пула соединений — параметры конфигурации.
- Диагностика проблем БД — поиск блота и непроиндексированных ключей.
💡 Важно знать
- Навык не анализирует вашу БД, а предоставляет инструкции. Для полного ревью используйте агента
database-reviewer.
- Для выполнения некоторых запросов (например,
pg_stat_statements) расширение нужно установить заранее.
- Параметры вроде
max_connections и work_mem указаны как пример. Адаптируйте их под доступную память и нагрузку.
- Навык основан на опыте Supabase — это проверенные практики для современных SaaS-приложений.
Комментарии
Комментариев пока нет. Будьте первым.