Postgres Patterns

by affaan-mef648e01899bNo license275K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 days ago

Patrones de base de datos PostgreSQL para optimización de consultas, diseño de esquemas, indexación y seguridad. Basado en las buenas prácticas de Supabase.

AI-generated overview

Quick-reference guide to PostgreSQL patterns for query optimization, schema design, indexing and security.

What it does
Provides a compact reference of PostgreSQL best practices covering index selection, data type choices, common query patterns such as upserts and cursor pagination, and Row Level Security policies. It also includes diagnostic SQL for finding unindexed foreign keys, slow queries and table bloat, plus a configuration template for connection limits, timeouts and monitoring. The deliverable is guidance and SQL snippets rather than an executable tool.
When to use it
Use it when writing SQL queries or migrations, designing database schemas, diagnosing slow queries, implementing Row Level Security, or configuring connection pooling. It is intended as a fast lookup while working on PostgreSQL databases.
Requirements
No scripts or runtime are required; it is an instructions-only reference. Applying the diagnostic queries assumes a PostgreSQL database, and some snippets reference extensions such as pg_stat_statements.

Patrones PostgreSQL

Referencia rápida de las buenas prácticas de PostgreSQL. Para orientación detallada, usa el agente database-reviewer.

Cuándo Activar

  • Escribir consultas SQL o migraciones
  • Diseñar esquemas de base de datos
  • Diagnosticar consultas lentas
  • Implementar Row Level Security
  • Configurar connection pooling

Referencia Rápida

Tabla de Índices

Patrón de ConsultaTipo de ÍndiceEjemplo
WHERE col = valueB-tree (por defecto)CREATE INDEX idx ON t (col)
WHERE col > valueB-treeCREATE INDEX idx ON t (col)
WHERE a = x AND b > yCompuestoCREATE INDEX idx ON t (a, b)
WHERE jsonb @> '{}'GINCREATE INDEX idx ON t USING gin (col)
WHERE tsv @@ queryGINCREATE INDEX idx ON t USING gin (col)
Rangos de series temporalesBRINCREATE INDEX idx ON t USING brin (col)

Referencia Rápida de Tipos de Datos

Caso de UsoTipo CorrectoEvitar
IDsbigintint, UUID aleatorio
Cadenastextvarchar(255)
Timestampstimestamptztimestamp
Dineronumeric(10,2)float
Flagsbooleanvarchar, int

Patrones Comunes

Orden del Índice Compuesto:

sql
-- Columnas de igualdad primero, luego columnas de rangoCREATE INDEX idx ON orders (status, created_at);-- Funciona para: WHERE status = 'pending' AND created_at > '2024-01-01'

Índice de Cobertura:

sql
CREATE INDEX idx ON users (email) INCLUDE (name, created_at);-- Evita la búsqueda en tabla para SELECT email, name, created_at

Índice Parcial:

sql
CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;-- Índice más pequeño, solo incluye usuarios activos

Política RLS (Optimizada):

sql
CREATE POLICY policy ON orders  USING ((SELECT auth.uid()) = user_id);  -- ¡Envolver en SELECT!

UPSERT:

sql
INSERT INTO settings (user_id, key, value)VALUES (123, 'theme', 'dark')ON CONFLICT (user_id, key)DO UPDATE SET value = EXCLUDED.value;

Paginación por Cursor:

sql
SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;-- O(1) vs OFFSET que es O(n)

Procesamiento de Cola:

sql
UPDATE jobs SET status = 'processing'WHERE id = (  SELECT id FROM jobs WHERE status = 'pending'  ORDER BY created_at LIMIT 1  FOR UPDATE SKIP LOCKED) RETURNING *;

Detección de Anti-Patrones

sql
-- Encontrar claves foráneas sin índiceSELECT conrelid::regclass, a.attnameFROM pg_constraint cJOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)WHERE c.contype = 'f'  AND NOT EXISTS (    SELECT 1 FROM pg_index i    WHERE i.indrelid = c.conrelid AND a.attnum = ANY(i.indkey)  );
-- Encontrar consultas lentasSELECT query, mean_exec_time, callsFROM pg_stat_statementsWHERE mean_exec_time > 100ORDER BY mean_exec_time DESC;
-- Verificar bloat de tablasSELECT relname, n_dead_tup, last_vacuumFROM pg_stat_user_tablesWHERE n_dead_tup > 1000ORDER BY n_dead_tup DESC;

Plantilla de Configuración

sql
-- Límites de conexión (ajustar según RAM)ALTER SYSTEM SET max_connections = 100;ALTER SYSTEM SET work_mem = '8MB';
-- TimeoutsALTER SYSTEM SET idle_in_transaction_session_timeout = '30s';ALTER SYSTEM SET statement_timeout = '30s';
-- MonitoreoCREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Valores predeterminados de seguridadREVOKE ALL ON SCHEMA public FROM public;
SELECT pg_reload_conf();

Relacionado

  • Agente: database-reviewer - Flujo de trabajo completo de revisión de base de datos
  • Skill: clickhouse-io - Patrones de analítica en ClickHouse
  • Skill: backend-patterns - Patrones de API y backend

Basado en Agent Skills de Supabase (crédito: equipo de Supabase) (Licencia MIT)

Source and attribution

Source:affaan-m/eccindocs/es/skills/postgres-patternsat commitef648e0

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal