~/VibeHandbook
PDF gratis

Bases de datos

postgresql.org

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;