PostgreSQL
Qué es
PostgreSQL es una relacional madura y de código abierto que almacena datos en tablas tipadas con un fuerte soporte para (Structured Query Language, lenguaje de consulta estructurado), transacciones e integridad de datos. Es conocida por su corrección, extensibilidad y funciones avanzadas como JSONB (el tipo binario de Postgres), búsqueda de texto completo y funciones de ventana. Es la opción por defecto para la mayoría de los backends de aplicaciones que necesitan datos estructurados confiables.
Fortalezas
- Piensa en una transferencia bancaria que se completa por completo o se cancela por completo — nunca queda a medias. Esa garantía de todo o nada se llama transacciones ACID (Atomicity, Consistency, Isolation, Durability; atomicidad, consistencia, aislamiento, durabilidad), y Postgres te da consistencia fuerte por defecto.
- SQL potente: joins, CTEs (Common Table Expressions, expresiones de tabla común), funciones de ventana y agregaciones.
- Tipos flexibles, incluyendo
JSONB, arreglos, rangos y tipos personalizados. - Extensiones como PostGIS (geoespacial) y
pgvector(embeddings). - Restricciones sólidas, claves foráneas y reglas de verificación que refuerzan la calidad de los datos.
Compromisos (trade-offs)
- El escalado vertical es sencillo; el sharding horizontal requiere herramientas adicionales.
- Requiere migraciones de esquema a medida que tu modelo evoluciona.
- Es más pesado de operar que una base de datos de un solo archivo para proyectos pequeños.
- El modelo de una conexión por cliente necesita un pooler (PgBouncer) a gran escala.
Cuándo usarlo
Recurre a PostgreSQL como tu opción por defecto para casi cualquier aplicación con datos relacionales, transacciones o necesidades de reportes: backends de SaaS (Software as a Service, software como servicio), comercio electrónico, analítica y cualquier cosa que se beneficie de restricciones y joins.
Encaje con vibe coding
Cuando dirijas a la IA, dale las entidades y sus relaciones, y luego pídele que produzca un esquema normalizado con claves primarias, claves foráneas, restricciones NOT NULL e índices sensatos. Insiste en consultas parametrizadas (nunca SQL concatenado con strings) para prevenir inyecciones, y pídele a la IA que envuelva las escrituras de varios pasos en una transacción. Un buen consejo: dile a la IA que también genere un archivo de migración reversible. Pídele que explique también cada índice que agrega. Así entenderás las compensaciones de lectura/escritura antes de aplicarlas.
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL CHECK (total >= 0),
status TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Parameterized query (placeholders, not concatenation)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;