К основному содержанию
скилл CX Codex

postgresql-best-practices — скилл для Claude Code: схема, индексы

Скилл с правилами разработки на PostgreSQL: типы данных, схема, индексы, разбор планов запросов и обслуживание базы.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Mindrally/skills --skill postgresql-best-practices -a claude-code
Открыть на GitHub

Что делает postgresql-best-practices

Скилл подсказывает агенту, как проектировать схему и ускорять запросы в PostgreSQL. Внутри — набор правил с примерами SQL: выбор нативных типов (UUID, JSONB, ARRAY, INET, CIDR), TIMESTAMPTZ вместо TIMESTAMP, ограничения NOT NULL и CHECK, партиционирование больших таблиц по RANGE, LIST или HASH.

Отдельный блок про индексы: B-tree для сравнений и диапазонов, GIN для JSONB и массивов, GiST для геометрии, BRIN для больших упорядоченных таблиц, частичные и покрывающие индексы. Есть запросы к pg_stat_user_indexes для поиска неиспользуемых индексов и EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) для разбора медленных планов. Про JSONB сказано прямо: выносите часто запрашиваемые поля в обычные колонки, а не гоняйте их через операторы @> и ?.

Дальше идут пулы соединений через PgBouncer или pgpool-II, таймауты сессии (statement_timeout, lock_timeout, idle_in_transaction_session_timeout), короткие транзакции, advisory-локи и запрос для поиска блокирующих сессий. Про VACUUM и ANALYZE текст обрывается на проверке раздутия таблиц, поэтому про autovacuum здесь только общая рекомендация. Скилл ничего не исполняет сам — это справочник, на который агент опирается при генерации SQL. Если у вас PostgreSQL старше 12, подсказки MATERIALIZED и NOT MATERIALIZED в CTE не сработают.

Какие задачи решает

  • выбрать тип колонки под деньги, время или идентификатор
  • разложить большую таблицу на партиции по дате
  • найти индекс, который тормозит вставки и не используется
  • разобрать план медленного запроса через EXPLAIN ANALYZE
  • настроить таймауты и пул соединений под короткие транзакции

Примеры запросов агенту

  • проверь схему таблицы orders и предложи, какие типы и ограничения поменять
  • почему этот запрос идёт через seq scan? разбери план и предложи индекс
  • собери DDL для таблицы events с партиционированием по created_at

Как установить postgresql-best-practices

1Через Skills CLI (Vercel)

npx skills add Mindrally/skills --skill postgresql-best-practices -a claude-code

2Вручную: положить файлы

~/.claude/skills/postgresql-best-practices/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/postgresql-best-practices/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о postgresql-best-practices

Как установить postgresql-best-practices в Claude?

Выполните npx skills add Mindrally/skills --skill postgresql-best-practices -a claude-code. Файл скилла появится по пути ~/.claude/skills/postgresql-best-practices/SKILL.md.

Что делает postgresql-best-practices?

Даёт агенту правила разработки на PostgreSQL: проектирование схемы, выбор типов, стратегии индексирования, разбор планов запросов, работа с JSONB, пулы соединений и транзакции.

Для каких платформ подходит скилл?

Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для каждой платформы своя команда установки и свой путь к файлу скилла.

Исходный текст

SKILL.md · Apache-2.0
---
name: postgresql-best-practices
description: PostgreSQL development best practices for schema design, query optimization, and database administration
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# PostgreSQL Best Practices

## Core Principles

- Leverage PostgreSQL's advanced features for robust data modeling
- Optimize queries using EXPLAIN ANALYZE and proper indexing strategies
- Use native PostgreSQL data types appropriately
- Implement proper connection pooling and resource management
- Follow PostgreSQL-specific security best practices

## Schema Design

### Data Types

- Use appropriate native types: `UUID`, `JSONB`, `ARRAY`, `INET`, `CIDR`
- Prefer `TIMESTAMPTZ` over `TIMESTAMP` for timezone-aware applications
- Use `TEXT` instead of `VARCHAR` when no length limit is needed
- Consider `NUMERIC` for precise decimal calculations (financial data)
- Use `SERIAL` or `BIGSERIAL` for auto-incrementing IDs, or `UUID` for distributed systems

```sql
CREATE TABLE orders (
    order_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    customer_id UUID NOT NULL REFERENCES customers(customer_id),
    order_data JSONB NOT NULL DEFAULT '{}',
    tags TEXT[] DEFAULT '{}',
    total_amount NUMERIC(12, 2) NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
```

### Table Design

- Always define primary keys
- Use foreign keys with appropriate ON DELETE/UPDATE actions
- Add NOT NULL constraints where appropriate
- Use CHECK constraints for data validation
- Consider partitioning for large tables

```sql
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    sku VARCHAR(50) NOT NULL UNIQUE,
    name TEXT NOT NULL,
    price NUMERIC(10, 2) NOT NULL CHECK (price >= 0),
    status VARCHAR(20) NOT NULL DEFAULT 'active'
        CHECK (status IN ('active', 'inactive', 'discontinued')),
    metadata JSONB DEFAULT '{}'
);
```

### Partitioning

- Use declarative partitioning for large tables (millions of rows)
- Choose appropriate partition strategy: RANGE, LIST, or HASH
- Create indexes on partitioned tables after partitioning

```sql
CREATE TABLE events (
    event_id BIGSERIAL,
    event_type VARCHAR(50) NOT NULL,
    payload JSONB,
    created_at TIMESTAMPTZ NOT NULL
) PARTITION BY RANGE (created_at);

CREATE TABLE events_2024_q1 PARTITION OF events
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
```

## Indexing Strategies

### Index Types

- Use B-tree indexes (default) for equality and range queries
- Use GIN indexes for JSONB, arrays, and full-text search
- Use GiST indexes for geometric data and range types
- Use BRIN indexes for large, naturally ordered data
- Consider partial indexes for filtered queries

```sql
-- B-tree index for common lookups
CREATE INDEX idx_orders_customer ON orders(customer_id);

-- GIN index for JSONB queries
CREATE INDEX idx_orders_data ON orders USING GIN (order_data);

-- Partial index for active records only
CREATE INDEX idx_active_products ON products(name) WHERE status = 'active';

-- Covering index to avoid table lookup
CREATE INDEX idx_orders_covering ON orders(customer_id)
    INCLUDE (order_date, total_amount);
```

### Index Maintenance

- Regularly run ANALYZE to update statistics
- Use REINDEX for bloated indexes
- Monitor index usage with `pg_stat_user_indexes`
- Remove unused indexes to reduce write overhead

```sql
-- Check index usage
SELECT schemaname, relname, indexrelname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC;
```

## Query Optimization

### EXPLAIN ANALYZE

- Always analyze query plans for slow queries
- Look for sequential scans on large tables
- Identify missing indexes from query plans
- Watch for high row estimates vs actual rows

```sql
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT c.name, COUNT(o.order_id)
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.created_at > '2024-01-01'
GROUP BY c.customer_id, c.name;
```

### Common Table Expressions (CTEs)

- Use CTEs for complex query organization
- Note: CTEs are optimization fences in older PostgreSQL versions
- Use `MATERIALIZED`/`NOT MATERIALIZED` hints in PostgreSQL 12+

```sql
WITH recent_orders AS MATERIALIZED (
    SELECT customer_id, COUNT(*) AS order_count, SUM(total) AS total_spent
    FROM orders
    WHERE order_date > CURRENT_DATE - INTERVAL '30 days'
    GROUP BY customer_id
)
SELECT c.name, ro.order_count, ro.total_spent
FROM customers c
JOIN recent_orders ro ON c.customer_id = ro.customer_id
WHERE ro.total_spent > 1000;
```

### Window Functions

- Use window functions for analytics queries
- Leverage PARTITION BY and ORDER BY for complex calculations

```sql
SELECT
    order_id,
    customer_id,
    total_amount,
    SUM(total_amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS running_total,
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS order_rank
FROM orders;
```

## JSONB Best Practices

- Use JSONB over JSON for better performance and indexing
- Create GIN indexes for JSONB columns you query
- Use containment operators (@>, <@) for efficient queries
- Extract frequently queried fields to regular columns

```sql
-- Efficient JSONB query with GIN index
SELECT * FROM products
WHERE metadata @> '{"category": "electronics"}';

-- Extract specific fields
SELECT
    product_id,
    metadata->>'brand' AS brand,
    (metadata->>'rating')::numeric AS rating
FROM products
WHERE metadata ? 'rating';
```

## Connection Management

### Connection Pooling

- Use PgBouncer or pgpool-II for connection pooling
- Set appropriate pool sizes based on workload
- Use transaction pooling mode for short-lived connections

### Connection Settings

```sql
-- Recommended session settings
SET statement_timeout = '30s';
SET lock_timeout = '10s';
SET idle_in_transaction_session_timeout = '60s';
```

## Transactions and Locking

- Use appropriate transaction isolation levels
- Keep transactions short to reduce lock contention
- Use advisory locks for application-level locking
- Monitor and resolve lock conflicts

```sql
-- Use advisory locks for application coordination
SELECT pg_advisory_lock(hashtext('resource_name'));
-- Do work
SELECT pg_advisory_unlock(hashtext('resource_name'));

-- Check for blocking queries
SELECT blocked_locks.pid AS blocked_pid,
       blocking_locks.pid AS blocking_pid,
       blocked_activity.query AS blocked_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_locks blocking_locks
    ON blocking_locks.locktype = blocked_locks.locktype
    AND blocking_locks.relation = blocked_locks.relation
    AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocked_activity
    ON blocked_activity.pid = blocked_locks.pid;
```

## Maintenance

### Vacuum and Analyze

- Enable autovacuum and tune for your workload
- Run manual VACUUM ANALYZE after bulk operations
- Monitor table bloat

```sql
-- Check table bloat
SELECT schemaname, relname,
       n_live_tup, n_dead_tup,
       round(n_dead_tup * 100.0 / nullif(n_live_tup + n_dead_tup, 0), 2) AS dead_pct
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;
```

### Backup Strategies

- Use pg_dump for logical backups
- Use pg_basebackup for physical backups
- Implement point-in-time recovery (PITR) with WAL archiving
- Test backup restoration regularly

## Security

- Use SSL/TLS for connections
- Implement row-level security (RLS) for multi-tenant applications
- Use roles and GRANT/REVOKE for access control
- Audit sensitive operations with pgAudit extension

```sql
-- Enable row-level security
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;

CREATE POLICY documents_tenant_policy ON documents
    FOR ALL
    USING (tenant_id = current_setting('app.tenant_id')::uuid);

-- Grant minimal privileges
GRANT SELECT, INSERT, UPDATE ON orders TO app_user;
GRANT USAGE ON SEQUENCE orders_order_id_seq TO app_user;
```

## Monitoring

- Monitor with pg_stat_statements extension
- Track slow queries and optimize regularly
- Set up alerts for replication lag, connection count, and disk usage
- Use pg_stat_activity to monitor active queries

```sql
-- Enable pg_stat_statements
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- Find slow queries
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
```

© Mindrally · Apache-2.0 · Mindrally/skills

Похожие скиллы

Все скиллы по теме «Данные и базы» →
postgresql-database-engineering manutej Помогает проектировать схемы, выбирать индексы и оптимизировать медленные запросы в PostgreSQL. Пригодится при партиционировании больших таблиц и настройке репликации. CX Codex +1 1 800установок sql-pro https://github.com/Jeffallan Оптимизирует медленные SQL-запросы, проектирует схемы баз данных и устраняет проблемы производительности. Пригодится при разборе планов EXPLAIN и миграции диалектов. CX Codex +1 6 400установок database-optimizer davila7 Скилл для Claude, который разбирает узкие места базы: планы выполнения, индексы, N+1, кеш и партиционирование. Пригодится, когда запросы тормозят, а непонятно почему. 286установок sql-optimization-patterns Seth Hobson Скилл разбирает медленные SQL-запросы, планы EXPLAIN и стратегию индексов. Нужен при поиске Seq Scan, проблемах с JOIN и N+1. CX Codex 19 717установок sql-query-optimization aj-geddes Скилл разбирает медленные SQL-запросы в PostgreSQL и MySQL: план выполнения, индексы, переписывание. Пригодится, когда запрос тормозит, а непонятно почему. CX Codex +1 520установок PostgreSQL Database Administration Claude Скилл по администрированию PostgreSQL: проектирование схем, индексы, бэкапы и разбор медленных запросов. Пригодится, когда агент пишет SQL для тикетницы или аналитики. CX Codex +1 452установок

Из того же набора168

htmx Правила разработки на HTMX: агент пишет разметку с hx-атрибутами и отдаёт с сервера только нужные фрагменты HTML. CX Codex +1 1 700установок scss-best-practices Скилл задаёт правила вёрстки на SCSS: структуру файлов 7-1, правила вложенности селекторов, систему переменных и соглашения БЭМ. Помогает агенту писать чистые стили. CX Codex +1 1 700установок jwt-security Скилл задаёт агенту правила создания, проверки и хранения JWT: белый список алгоритмов, обязательные claim-ы, короткие сроки жизни токенов. CX Codex +1 1 600установок flask-python Набор правил по Flask для ИИ-ассистентов. Задаёт паттерны фабрики приложений, синтаксис Marshmallow и организацию маршрутов через блюпринты. CX Codex +1 1 500установок tailwindcss Задаёт агенту стиль работы с TailwindCSS: утилитарные классы прямо в разметке, мобильный первым, тёмная тема через вариант dark:. CX Codex +1 1 500установок data-analysis-jupyter Задаёт правила для анализа данных, построения графиков и оформления блокнотов Jupyter с помощью pandas, numpy, matplotlib и seaborn. Помогает писать воспроизводимый код без лишних циклов. CX Codex +1 1 500установок express-typescript Правила для агента, который пишет API на Express.js и TypeScript: структура проекта, middleware, валидация и безопасность. CX Codex +1 1 400установок react-query Задаёт агенту правила работы с React Query: кэширование, фоновые обновления, инвалидация запросов и оптимистичные апдейты. CX Codex +1 1 400установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой