¿Alguna vez has pensado en el hecho de que el navegador que abres todos los días, el software de comunicación en tu teléfono e incluso la herramienta de notas en tu escritorio ocultan la misma base de datos ligera?
No requiere que instales ningún software de servidor, no necesita configuraciones de cuenta o contraseña, y ni siquiera necesita una conexión a Internet. Es simplemente un archivo, que descansa silenciosamente en tu disco duro, listo para servirte en cualquier momento.
Esta existencia discreta es SQLite.
¿Qué es SQLite? La base de datos más implementada del mundo
SQLite es un motor de base de datos relacional embebido escrito en C.
No tiene un proceso de servidor independiente, sino que está embebido directamente en tu aplicación para ejecutarse.
Esto es completamente diferente de PostgreSQL o MySQL con los que estás familiarizado. Las bases de datos tradicionales son servidores independientes que se ejecutan por separado, y tu programa debe “comunicarse” con ellos a través de un protocolo de red (TCP/IP).
Pero SQLite es diferente; es simplemente un bloque de código que se ejecuta directamente dentro de tu aplicación, leyendo y escribiendo ese archivo .db en tu disco duro.
| Dimensión de comparación | SQLite (Embebido) | PostgreSQL (Cliente-Servidor) |
|---|---|---|
| Modo de operación | Embebido directamente en la aplicación, sin servidor independiente | Proceso de servidor independiente, a través de conexión de red |
| Configuración | Configuración cero, sin instalación, sin credenciales | Requiere instalación, configuración de cuenta/contraseña y firewall |
| Almacenamiento de datos | Archivo único multiplataforma | Múltiples archivos bajo el directorio del servidor |
| Método de respaldo | Copiar directamente ese archivo | Requiere herramientas dedicadas como pg_dump |
Es precisamente debido a esta característica de “conectar y usar” que SQLite se ha convertido en el motor de base de datos más implementado del mundo.
Desde los sistemas operativos Android e iOS, los navegadores Chrome y Firefox, hasta Adobe Lightroom, WhatsApp e incluso el sistema de vuelo del Airbus A350, está en todas partes.
Uso de SQLite en Node.js
Si eres desarrollador de Node.js, usar SQLite es extremadamente simple. No necesitas instalar ningún software de servidor de base de datos en tu computadora, solo necesitas instalar un paquete npm para comenzar.
Las opciones más utilizadas en la industria hoy en día:
| Nombre del paquete | Características | Escenario recomendado |
|---|---|---|
sqlite3 |
El más establecido, admite APIs asíncronas | Cuando se necesita manejar muchas tareas asíncronas concurrentemente |
better-sqlite3 |
Rendimiento excelente, diseño de API intuitivo, extremadamente rápido | Recomendación principal, para eficiencia de desarrollo y velocidad de ejecución |
Crear una base de datos y consultarla con better-sqlite3 toma menos de cinco minutos:
const Database = require('better-sqlite3');
const db = new Database('my_project.db');
db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();
const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);
const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }
Si el archivo no existe,
better-sqlite3lo creará automáticamente para ti.
SQLite admite una sintaxis SQL más potente de lo que crees
Muchas personas piensan que SQLite es muy básico, pero admite la gran mayoría de la sintaxis SQL estándar, incluidas muchas características avanzadas:
| Categoría de sintaxis | Elementos admitidos |
|---|---|
| Operaciones básicas | SELECT, INSERT, UPDATE, DELETE |
| Definición de datos | CREATE TABLE, CREATE INDEX, CREATE VIEW |
| Consultas avanzadas | WITH (CTEs recursivas), Funciones de ventana (Window Functions) |
| Manejo de conflictos | UPSERT (INSERT ... ON CONFLICT DO UPDATE) |
| Procesamiento de JSON | Funciones integradas como json_extract, json_array, json_object, etc. |
| Control de transacciones | BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
| Consultas de unión | INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL OUTER JOIN |
La filosofía central de SQLite es “pequeño y hermoso”, admitiendo la mayoría de las capacidades SQL que necesitas a diario mientras se mantiene extremadamente ligero.
¿Dónde están los límites de SQLite?
La ligereza tiene un precio. Si se compara a SQLite con una tienda de barrio hipster con una sola caja de pago, entonces PostgreSQL es un Costco equipado con 50 cajas registradoras.
1. Atasco de tráfico de escritura
Cuando SQLite escribe datos, bloquea todo el archivo de la base de datos.
Imagina un restaurante con un solo baño: 100 personas pueden mirar el menú afuera (leer) al mismo tiempo, pero mientras 1 persona entra y cierra la puerta con llave (escribir), todos los demás solo pueden hacer fila y esperar.
Aunque activar el modo WAL (Write-Ahead Logging) puede mejorar el rendimiento de lectura/escritura concurrente, fundamentalmente sigue sin poder realizar escrituras concurrentes multiproceso en diferentes filas de datos.
2. No se puede distribuir en múltiples servidores
La esencia de SQLite es un archivo físico. Si tu sistema se despliega en múltiples servidores (escalado horizontal), estos servidores no pueden compartir de forma segura el mismo archivo.
3. Falta de gestión de permisos detallada
SQLite no tiene el concepto de “cuentas de usuario”. Cualquiera que pueda leer ese archivo .db a nivel del sistema operativo puede ver y modificar todos los datos.
Para sistemas de negocios que requieren auditorías estrictas de datos personales, esto es inaceptable.
SQLite vs. PostgreSQL: Decisiones de selección de tecnología
Las herramientas no son buenas ni malas, solo adecuadas o no. Aquí hay una lista de verificación definitiva para ayudarte a tomar decisiones:
| Pregunta | Respuesta “Sí” → Elige SQLite | Respuesta “No” → Elige PostgreSQL |
|---|---|---|
| ¿Hay solo un servidor backend, o se ejecuta completamente de forma local? | Sí | No (requiere escalado horizontal, múltiples máquinas) |
| ¿El comportamiento del sistema está dominado por la lectura, sin escrituras concurrentes de alta frecuencia? | Sí | No (los usuarios competirán por escribir concurrentemente) |
| ¿No necesitas permisos de cuenta de base de datos detallados o indexación avanzada? | Sí | No (depende en gran medida de características avanzadas) |
Comparaciones de escenarios más específicos:
| Escenario | Selección recomendada | Razón |
|---|---|---|
| Software de escritorio, Aplicaciones móviles, Dispositivos IoT | SQLite | Los datos viajan con el dispositivo, sin instalación |
| Blogs personales, Sitios web de exhibición | SQLite | Mucha lectura, poca escritura, ahorra costos de mantenimiento de servidor |
| Desarrollo rápido de prototipos, Demos | SQLite | Simplemente crea un archivo para comenzar |
| Foros comunitarios, Plataformas de comercio electrónico | PostgreSQL | Alta concurrencia de escritura, requiere bloqueo a nivel de fila |
| Despliegue distribuido en múltiples servidores | PostgreSQL | Necesita compartir la fuente de datos entre diferentes máquinas |
| Sistemas sensibles como médicos o financieros | PostgreSQL | Requiere un control de permisos estricto basado en roles |
¿Es tu base de datos una nota de bolsillo o una centralita telefónica central?
Si los datos son “monomáquina, estáticos, de un solo propietario”, elige SQLite para disfrutar de una ligereza y libertad extremas;
Si los datos son “en la nube, dinámicos, altamente interactivos”, deja que PostgreSQL se haga cargo.
La filosofía central de SQLite es “un componente interno de la aplicación”, mientras que PostgreSQL se posiciona como “un centro independiente de la arquitectura del sistema”.
La próxima vez que tomes una decisión de arquitectura, no te apresures a sacar PostgreSQL. Pregúntate primero:
"¿Es mi base de datos una nota de bolsillo o una centralita telefónica central?"
Una vez que la respuesta esté clara, la elección naturalmente se vuelve obvia.