· Tutoriales  · 5 min read

Crear y Usar Tablas Unlogged en PostgreSQL

¡Hola, compañeros desarrolladores! ¿Alguna vez han recurrido a Redis cuando en realidad solo necesitaban un lugar rápido para guardar datos temporales? Yo también he estado en esa situación. Si bien Redis es una herramienta fantástica (y la uso constantemente), a veces se siente como usar una herramienta sofisticada cuando solo necesitas algo simple. Si ya utilizas PostgreSQL en tu stack, tengo un truco muy útil que podría ahorrarte problemas de infraestructura: ¡tablas unlogged (sin registro)! Vamos a ver cómo puedes usarlas con Go como una alternativa más sencilla para ciertos casos.

🔍 ¿Qué son las Tablas Unlogged?

Piensa en las tablas unlogged como la forma en que PostgreSQL dice: “Voy a intercambiar algo de seguridad por velocidad”. A diferencia de sus primas más cautelosas (las tablas regulares), las tablas unlogged se saltan todo el asunto del Write-Ahead Logging. Esto es lo que eso significa para ti:

  • Escrituras más rápidas: Tus datos se almacenan sin la sobrecarga habitual de registro. ¡Hola, mejora de rendimiento!
  • Sin seguridad ante fallos: Si tu base de datos decide tomar una siesta inesperada (falla), esos datos se van. Como lágrimas en la lluvia.
  • Sin replicación: Estas tablas no aparecerán en tu replicación de streaming. Son lobos solitarios.

Perfecto para esos momentos en que necesitas almacenamiento rápido para cosas que puedes reconstruir o por las que no llorarías si desaparecieran: datos de sesión, cachés, esos resultados intermedios durante el procesamiento de grandes datos.

⚔️ Redis vs. Tablas Unlogged: El Enfrentamiento

Los Superpoderes de Redis

  • Magia en memoria: Respuestas ultrarrápidas que hacen que todo lo demás parezca lento.
  • Navaja suiza de estructuras de datos: Listas, sets, sets ordenados, pub/sub. Redis lo tiene todo.
  • Persistencia flexible: ¿Quieres guardar tus datos? Configúralo como quieras.

Cuando las Tablas Unlogged Brillan

  • Una cosa menos que gestionar: ¿Ya tienes PostgreSQL? Estás listo.
  • Bondades de SQL: Une tablas, ejecuta consultas complejas y mantén esa conformidad ACID donde la necesites.
  • Maneja datos grandes: ¿Tienes más datos que memoria? No hay problema, estas tablas viven en disco.

🤔 ¿Cuándo Deberías Recurrir a las Tablas Unlogged?

  • Estás tratando de mantener tu infraestructura simple.
  • Tus datos tienen más sentido en filas y columnas, y quieres esas dulces consultas SQL.
  • Una pequeña pérdida de datos durante fallos no terminaría el mundo, o tu carrera.

🛠️ Tutorial: Construir un Caché de Sesiones con Tablas Unlogged en Go

Paso 1: Crear Tu Tabla Veloz

Primero, digámosle a PostgreSQL que configure nuestra tabla unlogged:

CREATE UNLOGGED TABLE sessions (
    id TEXT PRIMARY KEY,
    user_id INT NOT NULL,
    data JSONB,
    expires_at TIMESTAMPTZ NOT NULL
);

Paso 2: Conectar Tu Aplicación Go a PostgreSQL

Conectemos las cosas con el driver pgx (mi favorito personal):

package main

import (
	"context"
	"fmt"
	"github.com/jackc/pgx/v5/pgxpool"
)

func main() {
	connStr := "postgres://user:password@localhost:5432/dbname"
	pool, err := pgxpool.New(context.Background(), connStr)
	if err != nil {
		panic(err)
	}
	defer pool.Close()

	// Verificación rápida de cordura
	err = pool.Ping(context.Background())
	if err != nil {
		panic(err)
	}
	fmt.Println("¡Conectado a PostgreSQL! ¡Estamos en el negocio!")
}

Paso 3: Guardar y Recuperar Tus Sesiones

Crea una nueva sesión:

func createSession(pool *pgxpool.Pool, sessionID string, userID int, data map[string]interface{}, expiresAt time.Time) error {
	query := `
		INSERT INTO sessions (id, user_id, data, expires_at)
		VALUES ($1, $2, $3, $4)`
	_, err := pool.Exec(context.Background(), query, sessionID, userID, data, expiresAt)
	return err
}

Obtén esa sesión cuando la necesites:

func getSession(pool *pgxpool.Pool, sessionID string) (userID int, data map[string]interface{}, err error) {
	query := `
		SELECT user_id, data
		FROM sessions
		WHERE id = $1 AND expires_at > NOW()`
	err = pool.QueryRow(context.Background(), query, sessionID).Scan(&userID, &data)
	return
}

Paso 4: Mantener las Cosas Ordenadas

Agreguemos una pequeña función de limpieza para barrer las sesiones expiradas:

func cleanupSessions(pool *pgxpool.Pool) {
	query := "DELETE FROM sessions WHERE expires_at <= NOW()"
	_, err := pool.Exec(context.Background(), query)
	if err != nil {
		fmt.Printf("Ups, la limpieza falló: %v\n", err)
	}
}

// Ejecuta esto periódicamente con un time.Ticker.

🚀 La Verificación de Rendimiento Real

¿Qué tan rápidas son estas tablas unlogged? En mis pruebas, son aproximadamente 2-3 veces más rápidas en escrituras comparadas con tablas regulares. ¡Eso no es nada despreciable! Pero seamos realistas: todavía están escribiendo en disco, así que Redis (con sus superpoderes en memoria) las superará para cargas de trabajo pesadas de lectura/escritura.

Si estás bien con unos pocos milisegundos de latencia, como para sesiones de usuario donde los humanos no notarán la diferencia, las tablas unlogged podrían ser tu nuevo mejor amigo.

⚠️ Cuidado con Estas Trampas

  • Espera amnesia: Después de fallos, esos datos se han ido. ¡Planifica en consecuencia!
  • El vacuum aún se ejecuta: PostgreSQL aún necesita limpiar, así que configura tus ajustes de autovacuum si estás procesando muchos datos.
  • Vigila el crecimiento: Monitorea el tamaño de tu tabla con pg_stat_user_tables para que las cosas no se salgan de control.
  • Indexa sabiamente: Los índices acelerarán tus lecturas pero ralentizarán las escrituras. Elige tus batallas.

🎯 Resumiendo

Ok, las tablas unlogged no van a reemplazar a Redis para todo, ¡y no deberían! Pero son un truco ingenioso para tener bajo la manga, especialmente cuando ya estás metido hasta las rodillas en PostgreSQL y quieres mantener las cosas simples.

La implementación en Go es súper directa con pgx, y puedes integrarla directamente en tus sistemas existentes sin mucho alboroto. Antes de saltar, piensa en cuánta pérdida de datos puedes tolerar y cómo se ven tus patrones de carga. Si absolutamente necesitas velocidad tipo Redis, quédate con Redis, pero si la simplicidad es lo tuyo y PostgreSQL ya es parte de tu stack, dale una oportunidad a las tablas unlogged.

Consejo profesional de un desarrollador curtido en batallas: ¿Por qué no usar ambos? Redis para las cosas que necesitan respuestas ultrarrápidas, y tablas unlogged para los fragmentos más grandes de datos que funcionan bien con SQL. ¡Lo mejor de ambos mundos!

Volver al Blog