PostgreSQL avanzado: JSONB, arrays y todo lo que SQLite no tiene
JSONB de verdad, arrays nativos, window functions, CTEs recursivos, upsert, full-text search, particionado y triggers — sobre Postgres real, compilado a WebAssembly.
13 aulas · 8 horas de práctica · en el navegador, sin instalar nada
Temario
- JSONB: un documento adentro de una columna — Por qué JSONB no es "un TEXT con JSON adentro": los operadores ->, ->> y @>, y el índice GIN que los hace rápidos incluso con millones de filas.
- Arrays nativos: una columna que guarda varios valores — INTEGER[]/TEXT[], ARRAY[...], = ANY(), UNNEST() — y cuándo un array de columna tiene sentido frente a una tabla relacionada aparte.
- Window functions: agregar sin perder la fila — El problema que GROUP BY no resuelve: ROW_NUMBER(), RANK(), PARTITION BY y OVER (ORDER BY...) calculan un ranking o un acumulado sin colapsar las filas.
- CTEs: nombrarle un paso a una consulta, y recorrer un árbol — WITH ... AS (...) para partir una consulta larga en pasos legibles, y WITH RECURSIVE para recorrer jerarquías (categorías, organigramas) sin saber de antemano cuántos niveles tienen.
- RETURNING y upsert: evitar un segundo viaje a la base — RETURNING devuelve lo que un INSERT/UPDATE/DELETE acaba de cambiar, sin un SELECT aparte. ON CONFLICT ... DO UPDATE resuelve "insertar o actualizar" en una sola sentencia atómica.
- Taller — Catálogo con carrito — Un catálogo de productos con atributos variables (JSONB) y tags (array), y un carrito con upsert atómico — JSONB, arrays, CTE y upsert, en un caso chico y realista.
- Índices más allá del B-tree, y cómo leer un EXPLAIN ANALYZE — GIN para JSONB, arrays y full-text; y las primeras herramientas para leer un plan de ejecución: seq scan vs. index scan, costo estimado vs. tiempo real.
- Full-text search: buscar texto de verdad, no con LIKE — to_tsvector, to_tsquery y @@ entienden idioma (raíces de palabras, orden irrelevante) y usan un índice — algo que LIKE '%...%' no puede hacer.
- Particionado declarativo: partir una tabla grande en pedazos — PARTITION BY RANGE/LIST divide una tabla lógicamente en varias tablas físicas más chicas — transparente para quien consulta, pero clave cuando una tabla crece sin límite.
- Funciones y triggers en PL/pgSQL — CREATE FUNCTION ... LANGUAGE plpgsql para lógica reusable adentro de la base, y un trigger AFTER UPDATE que reacciona sola cuando cambia un dato — sin que ninguna aplicación tenga que acordarse de hacerlo.
- Cierre: JSONB, arrays, CTEs y window functions, juntos — Una consulta más grande que combina JSONB, arrays, un CTE y una window function, y una guía de cuándo usar cada herramienta de esta carrera.
- Taller — Dashboard de analítica — Un log de eventos de verdad: gasto acumulado por usuario (CTE + window function), búsqueda de incidentes (full-text search), y un historial de compras confirmadas que combina las tres cosas — el cierre de todo el curso.
- Taller — ¿Quién rompió producción? — Un incidente de producción de verdad: WHERE y ORDER BY sobre el historial de deploys, JOIN y JSONB sobre los logs, una CTE con ROW_NUMBER() para encontrar la falla que sigue viva, y una última CTE con BETWEEN que confirma quién tenía la terminal abierta a esa hora.