Postgres Patterns

作者 affaan-mef648e01899b無授權條款275K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫3 天前更新

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 產生的概覽

PostgreSQL 模式速查指南,涵蓋查詢最佳化、結構設計、索引與安全性。

功能
提供 PostgreSQL 最佳實務的精簡參考,涵蓋索引選擇、資料型別選擇、常見查詢模式(例如 upsert 與游標分頁)以及資料列層級安全性原則。也包含用於找出未建立索引的外鍵、慢查詢與資料表膨脹的診斷 SQL,以及連線數、逾時與監控的設定範本。產出是指導說明與 SQL 片段,而非可執行的工具。
適用情境
適用於撰寫 SQL 查詢或移轉、設計資料庫結構、診斷慢查詢、實作資料列層級安全性或設定連線池的情境。它旨在作為處理 PostgreSQL 資料庫時的快速查閱參考。
執行需求
不需要指令碼或執行環境,僅為說明性參考。套用診斷查詢需要 PostgreSQL 資料庫,部分片段涉及 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)

來源與署名

來源:affaan-m/ecc位於docs/es/skills/postgres-patterns提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架