Bases de datos
Una base de datos (DB) es un sistema organizado para almacenar, gestionar y recuperar información de forma eficiente y segura. A diferencia de los ficheros, las bases de datos están diseñadas para consultas rápidas, concurrencia de múltiples usuarios, integridad de datos y escalabilidad.
El acceso a bases de datos es fundamental para aplicaciones de cualquier tamaño: desde un blog que necesita guardar usuarios y posts, hasta sistemas bancarios con miles de transacciones por segundo.
Tipos de bases de datos
Bases de datos relacionales (RDBMS o SQL)
- Organizan la información en tablas compuestas por filas (registros) y columnas (campos).
- Utilizan SQL (Structured Query Language) para consultas y manipulación de datos.
- Soportan transacciones, integridad referencial y restricciones (constraints).
- Ejemplos: MySQL, PostgreSQL, SQLite, Oracle DB.
Ejemplo conceptual de tabla Usuarios:
| id | nombre | edad | |
|---|---|---|---|
1 | Ana | ana@example.com | 28 |
2 | Luis | luis@example.com | 35 |
Ejemplo SQL:
SELECT nombre, email FROM Usuarios WHERE edad > 30;
Bases de datos no relacionales (NoSQL)
- No utilizan tablas estrictas; pueden ser documentos, clave-valor, columnas o grafos.
- Ventaja: flexibilidad de esquema, escalabilidad horizontal, adecuado para grandes volúmenes y datos semi-estructurados.
- Ejemplos: MongoDB (documentos), Redis (clave-valor), Cassandra (column-family), Neo4j (grafos).
Ejemplo conceptual en MongoDB (documento de usuario):
{
"_id": "abc123",
"nombre": "Ana",
"email": "ana@example.com",
"edad": 28
}
Modelos de interacción con bases de datos
- Conexión directa
- El programa establece una conexión con la base de datos mediante un driver o librería.
- Puede ejecutar consultas SQL directamente o instrucciones específicas del motor.
- ORM (Object-Relational Mapping)
- Query Builders
- Librerías que generan consultas SQL dinámicamente a partir de métodos de programación.
- Ejemplo: Knex.js en Node.js.
Operaciones básicas (CRUD)
Toda interacción con bases de datos se resume en CRUD:
| Operación | SQL | Concepto |
|---|---|---|
| Create | INSERT INTO | Crear un nuevo registro |
| Read | SELECT | Leer o consultar datos |
| Update | UPDATE | Modificar datos existentes |
| Delete | DELETE | Eliminar registros |
Transacciones y consistencia
- Una transacción es un conjunto de operaciones que se ejecutan como una unidad atómica.
- ACID: Atomicity, Consistency, Isolation, Durability.
Ejemplo conceptual: transferencia de saldo entre dos cuentas:
- Restar saldo a la cuenta A.
- Sumar saldo a la cuenta B.
- Solo confirmar los cambios si ambas operaciones fueron exitosas (COMMIT); de lo contrario, revertir (ROLLBACK).
[Restar saldo] → [Sumar saldo] → COMMIT / ROLLBACK
Concurrencia y bloqueo
- Múltiples usuarios pueden acceder y modificar datos al mismo tiempo.
- Problemas comunes: lost updates, dirty reads, race conditions.
- Mecanismos de control:
- Bloqueo pesimista: bloquear filas/tablas mientras se realizan cambios.
- Bloqueo optimista: detectar conflictos en commit mediante versiones o timestamps.
Seguridad y buenas prácticas
- Autenticación y autorización: cada usuario o aplicación con permisos mínimos necesarios.
- Consultas parametrizadas / prepared statements: evitar inyección SQL.
- Cifrado: proteger datos sensibles en reposo y en tránsito (TLS).
- Backups regulares y prueba de restauración.
- Monitoreo de consultas: detectar consultas lentas y optimizar índices.
Rendimiento y escalabilidad
- Indexado: mejorar la velocidad de lectura, sobre todo en columnas consultadas frecuentemente.
- Particionamiento / Sharding: dividir datos grandes en varias bases o nodos.
- Caché: almacenar resultados frecuentes en memoria (Redis, Memcached).
- Batching / Bulk operations: agrupar inserciones o actualizaciones para reducir overhead.
Ejemplo conceptual de flujo de acceso a una base de datos
- Conectar con la base de datos.
- Leer los datos existentes según la consulta requerida.
- Procesar los datos en la aplicación (ej. aplicar filtros, cálculos).
- Guardar cambios mediante transacciones si es necesario.
- Cerrar la conexión.