PostgreSQL es mucho más que una base relacional. Comparto técnicas avanzadas que uso en producción.
JSONB para datos semi-estructurados
No siempre necesitas MongoDB para datos flexibles. PostgreSQL con JSONB te da lo mejor de ambos mundos: esquema relacional para datos estructurados y JSONB para metadata variable. En el chatbot que desarrollé, los mensajes tienen estructura fija pero el payload de WhatsApp varía enormemente. JSONB con índices GIN resuelve esto elegantemente.
PostGIS para geolocalización
En GPS Tracker, necesitábamos: almacenar posiciones GPS, calcular distancias, detectar si un vehículo está dentro de una geocerca, y consultar vehículos cercanos. PostGIS maneja todo esto con queries SQL y spatial indexes. Una consulta de "vehículos en un radio de 5km" con 100K registros se ejecuta en 15ms.
Table partitioning
Cuando una tabla supera los 100M de registros, las queries se degradan incluso con índices. La solución: particionamiento. En GPS Tracker particionamos la tabla de posiciones por rango temporal (mensual). Las consultas de posiciones del mes actual solo escanean la partición activa, ignorando los mil millones de registros históricos.
Optimización de queries
- ▹ EXPLAIN ANALYZE siempre antes de poner una query en producción.
- ▹ Índices parciales: indexa solo los datos que realmente consultas (WHERE active = true).
- ▹ CTEs materializados: PostgreSQL 12+ te permite controlar si un CTE se materializa o se inlinea.
- ▹ Connection pooling: PgBouncer es obligatorio en producción. Sin él, cada conexión crea un proceso del SO.