Referencia API
Database API

Database API

Abstracción de base de datos multi-proveedor.

Objetivos

  • Uniformar operaciones CRUD
  • Soportar múltiples proveedores (PostgreSQL, MongoDB, Redis, etc.)
  • Simplificar transacciones
  • Extensible por repositorios

Patrón Repositorio (Ejemplo Simplificado)

interface Repository<T> {
  findById(id: string|number): Promise<T|null>;
  find(filter?: any): Promise<T[]>;
  create(data: Partial<T>): Promise<T>;
  update(id: string|number, data: Partial<T>): Promise<T>;
  delete(id: string|number): Promise<boolean>;
}

Configuración

const db = await DatabaseFactory.create({
  provider: 'postgresql',
  connection: {
    host: 'localhost', port: 5432,
    database: 'app', username: 'user', password: 'pass'
  }
});

Transacciones

await db.transaction(async trx => {
  const user = await trx.users.create(data);
  await trx.audit.log({...});
});

Ejemplo de Repositorio

class UserRepository {
  constructor(private db){ }
  async findActive(limit=50){
    return this.db.query('SELECT * FROM users WHERE active = true LIMIT $1', [limit]);
  }
}

Migraciones (Concepto)

  • Archivos numerados / timestamp
  • Up / Down
  • Registro en tabla migrations

Indexación

Asegura índices para campos consultados frecuentemente.

Capa de Cache

Combinar con Cache API para query caching:

const key = `user:${id}`;
const cached = await cache.get(key);
if (cached) return cached;
const user = await repo.findById(id);
await cache.set(key, user, 300);

Auditoría mediante Eventos

Publicar eventos en cambios críticos:

await eventBus.publish({
  type: 'user.updated', aggregateId: user.id, data: { changes }
});

Buenas Prácticas

TemaRecomendación
ConexionesPool configurado (min/max)
TransaccionesCortas, evitar lógica externa prolongada
ValidaciónPre-validar datos antes de persistir
SeguridadSQL parametrizado / ORM seguro
ObservabilidadLog de queries lentas (>200ms)

Errores Comunes

ProblemaCausaMitigación
BloqueosTransacciones largasReducir alcance
Hotspot rowAlta concurrenciaSharding / colas
Pool agotadoFugas de conexionesLiberar recursos finalmente