PUNTOS CLAVE
- Base de datos transaccional NoSQL integrada en el navegador que soporta índices y búsquedas complejas.
- Operaciones 100% asíncronas para evitar bloqueos del hilo principal (Main Thread).
- Capacidad de almacenamiento vinculada al espacio libre del disco (hasta 60-80% en Chrome).
- Permite almacenar objetos JavaScript complejos, Archivos y Blobs mediante el algoritmo de clonación estructurada.
- Esencial para el caché de aplicaciones (PWA) y funcionamiento sin conexión.
En el desarrollo moderno de aplicaciones web, la dependencia exclusiva del servidor para la gestión de datos se ha convertido en un cuello de botella. IndexedDB emerge como la solución definitiva para liberar a las aplicaciones de esta restricción, permitiendo el almacenamiento persistente de grandes cantidades de datos estructurados directamente en el dispositivo del usuario. A diferencia de mecanismos más simples, esta tecnología habilita la creación de herramientas complejas que mantienen su funcionalidad completa incluso en entornos desconectados u hostiles, una necesidad crítica para el software profesional en 2026.
#Arquitectura y Modelo de Datos
IndexedDB rompe con el modelo relacional tradicional. No existen tablas, filas ni columnas predefinidas. En su lugar, utilizamos Object Stores (almacenes de objetos) que guardan datos JavaScript indexados por una clave primaria. Este diseño NoSQL permite una flexibilidad extrema en la estructura de la información almacenada.
El aspecto más crítico de su diseño es su naturaleza asíncrona. Cualquier operación de lectura o escritura se ejecuta fuera del hilo principal de ejecución. Esto es deliberado: al mover gigabytes de datos, una operación síncrona (como las de localStorage) congelaría la interfaz del usuario, degradando la experiencia a niveles inaceptables.
TÉRMINO RELACIONADO
El Structured Cloning Algorithm es el mecanismo que usa IndexedDB para serializar datos. A diferencia de JSON, permite clonar y almacenar objetos complejos como Blob, File, Map, Set y referencias circulares.
#Gestión de Quotas y Límites Reales
La pregunta recurrente sobre el límite de almacenamiento ya no tiene una respuesta fija en megabytes. Los navegadores modernos (Chrome, Edge, Firefox) calculan la cuota disponible basándose en el espacio libre del disco duro del usuario.
En una implementación estándar sobre Chromium, un origen puede reclamar hasta el 60% del espacio disponible en disco. Sin embargo, Firefox y Safari implementan políticas de «evicción» más agresivas. Especialmente en Safari (iOS/macOS), si el dispositivo se queda sin espacio, el navegador eliminará bases de datos completas que no hayan sido accedidas recientemente (generalmente 7 días sin uso en versiones anteriores) sin aviso previo al usuario, aunque esto ha mejorado con la API de Storage Manager para persistencia explícita.
#Caso Real: Catálogo de Arquitectura
«Laura», desarrolladora senior en una firma de software para arquitectura, se enfrentó a un reto crítico. Su aplicación debía permitir a los arquitectos mostrar renders 3D de alta resolución (archivos GLB de 50MB+) a clientes en obras sin conexión a internet. La versión inicial intentaba cargar todo en memoria RAM, lo que provocaba cierres inesperados en iPads antiguos.
Laura reescribió la capa de datos para usar IndexedDB. En lugar de mantener los modelos en memoria, los almacenaba como Blobs en la base de datos local. Al seleccionar un modelo, la app solo recuperaba ese registro específico mediante un índice, manteniendo la huella de memoria baja. Implementó un sistema donde la «Vista Previa» (JPG ligero) se cargaba primero, y el modelo 3D pesado se extraía de IndexedDB bajo demanda. Esto eliminó los bloqueos de la UI y permitió almacenar hasta 4GB de proyectos en el dispositivo del cliente.
Para gestionar esto, Laura diseñó la siguiente estructura de base de datos que separa los metadatos ligeros de los archivos binarios pesados:
// Estructura de la Base de Datos implementada por Laura
const dbSchema = {
name: 'ArchiViewerDB',
version: 1,
stores: [
{
name: 'projects_meta', // Metadatos ligeros para búsquedas rápidas
keyPath: 'id',
indexes: [
{ name: 'by_client', keyPath: 'clientName' },
{ name: 'by_date', keyPath: 'updatedAt' }
]
},
{
name: 'assets_heavy', // Almacenamiento de Blobs pesados
keyPath: 'assetId',
// No indexamos el contenido binario, solo su ID
}
]
};
// Flujo de recuperación eficiente
async function getProjectAsset(assetId) {
// Solo abrimos transacción de lectura en el store pesado cuando es necesario
const db = await openDB('ArchiViewerDB', 1);
return db.get('assets_heavy', assetId);
}#Estrategias de Implementación
Trabajar con la API nativa de IndexedDB (`indexedDB.open`) puede resultar verboso y propenso a errores debido a su gestión de eventos antigua. La práctica estándar en la industria es utilizar envoltorios (wrappers) basados en Promesas que simplifican la sintaxis sin sacrificar rendimiento.
TIP PRO
Utiliza librerías ligeras como idb (de Google) o Dexie.js. Estas abstraen la complejidad de las transacciones y el versionado, permitiéndote usar
async/await directamente, lo que hace el código mucho más legible y mantenible.Es crucial gestionar correctamente el ciclo de vida de la conexión. Abrir una base de datos es una operación costosa; lo ideal es mantener una conexión abierta o utilizar un patrón singleton en tu módulo de base de datos, en lugar de abrir y cerrar la conexión con cada lectura.
PROBLEMA COMÚN
Olvidar manejar el evento
onblocked. Esto ocurre si intentas actualizar la versión de la base de datos (migración) mientras otra pestaña tiene la versión antigua abierta. Debes recargar la página o cerrar las conexiones viejas para evitar inconsistencias.#Cuándo usar / Cuándo NO usar
Elegir IndexedDB debe ser una decisión técnica fundamentada en los requisitos de datos.
- Cuándo usar: Necesitas persistencia offline robusta, almacenas archivos (imágenes/PDFs), manejas grandes listas de datos que requieren filtrado/ordenamiento local, o tu cuota de datos supera los 10MB.
- Cuándo NO usar: Para guardar configuraciones simples de usuario (tema oscuro/claro), tokens de sesión pequeños o banderas de estado efímeras. Para estos casos, localStorage o sessionStorage son más rápidos de implementar y suficientes.
#Pros y Contras
Analiza estas características antes de integrar la tecnología en tu stack.
- Pros: Capacidad masiva (Gigabytes), transacciones atómicas seguras, alto rendimiento en búsquedas indexadas, soporte binario nativo.
- Contras: Curva de aprendizaje inicial elevada, necesidad de gestionar migraciones de esquema (Schema Versioning), disparidad en políticas de borrado automático entre navegadores (Safari vs Chrome).
| Criterio | IndexedDB | LocalStorage |
|---|---|---|
| Modelo | Asíncrono (Non-blocking) | Síncrono (Blocking) |
| Capacidad | ~60% del disco libre | 5 – 10 MB |
| Tipos de Datos | Objetos complejos, Blobs, Archivos | Strings únicamente |
| Búsquedas | Índices Multi-key | Clave-Valor lineal |
¿Qué es IndexedDB?
Es una API de bajo nivel para almacenar grandes cantidades de datos estructurados, incluyendo archivos y blobs, en el navegador del usuario. Usa índices para permitir búsquedas de alto rendimiento.