Tipos de Bases de Datos
Las bases de datos se dividen principalmente en dos tipos: SQL (relacional) y NoSQL (no relacional). Ninguna es mejor que la otra, lo importante es elegir segun el proposito.
SQL (Base de Datos Relacional)
Caracteristicas
- Almacena datos en tablas (filas y columnas)
- Define el esquema (estructura de datos) previamente
- Lenguaje de consulta estandarizado mediante SQL
- Garantia de transacciones mediante propiedades ACID
-- Definicion de tabla
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
total DECIMAL(10, 2),
status VARCHAR(20)
);
-- Consulta usando relaciones
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';
Propiedades ACID
| Propiedad | Descripcion |
|---|---|
| Atomicity (Atomicidad) | La transaccion tiene exito completamente o falla completamente |
| Consistency (Consistencia) | Los datos siempre estan en un estado consistente |
| Isolation (Aislamiento) | Las transacciones no se afectan entre si |
| Durability (Durabilidad) | Los datos confirmados no se pierden |
Bases de Datos Representativas
| Base de Datos | Caracteristicas |
|---|---|
| PostgreSQL | Alta funcionalidad, gran extensibilidad |
| MySQL | Ampliamente utilizada, popular en desarrollo web |
| SQLite | Ligera, para uso embebido |
| Oracle | Para empresas |
NoSQL
Tipos y Caracteristicas
1. Tipo Documento
Almacena datos en documentos similares a JSON.
// Ejemplo de MongoDB
{
"_id": "user_123",
"name": "Alice",
"email": "alice@example.com",
"orders": [
{ "id": "ord_1", "total": 5000, "items": [...] },
{ "id": "ord_2", "total": 3000, "items": [...] }
],
"preferences": {
"theme": "dark",
"language": "ja"
}
}
Ejemplos representativos: MongoDB, CouchDB, Firestore
2. Tipo Clave-Valor
Almacena datos en pares simples de clave y valor.
user:123:name → "Alice"
user:123:email → "alice@example.com"
session:abc123 → { "userId": 123, "expires": "..." }
Ejemplos representativos: Redis, Amazon DynamoDB, etcd
3. Tipo Columnar
Almacena datos por columnas en lugar de filas. Adecuado para agregacion de grandes volumenes de datos.
flowchart TB
subgraph RowBased["Almacenamiento basado en filas"]
R1["user_1 | Alice | alice@ex.com"]
R2["user_2 | Bob | bob@ex.com"]
end
subgraph ColumnBased["Almacenamiento por columnas"]
C1["name → Alice, Bob, ..."]
C2["email → alice@ex.com, bob@ex.com, ..."]
end
RowBased --> ColumnBased
Ejemplos representativos: Apache Cassandra, HBase, ClickHouse
4. Tipo Grafo
Almacena datos como relaciones de nodos y aristas.
(Alice)--[FOLLOWS]-->(Bob)
(Alice)--[LIKES]-->(Post1)
(Bob)--[WROTE]-->(Post1)
Ejemplos representativos: Neo4j, Amazon Neptune, ArangoDB
Teorema CAP
Teorema que establece que en un sistema distribuido, solo se pueden satisfacer 2 de las siguientes 3 propiedades simultaneamente.
flowchart TB
subgraph CAP["Teorema CAP"]
C["Consistency<br/>(Consistencia)"]
A["Availability<br/>(Disponibilidad)"]
P["Partition Tolerance<br/>(Tolerancia a particiones)"]
CP["CP: MongoDB, Redis Cluster"]
AP["AP: Cassandra, CouchDB"]
CA["CA: RDBMS de nodo unico"]
C --- CP
P --- CP
A --- AP
P --- AP
C --- CA
A --- CA
end
| Propiedad | Descripcion |
|---|---|
| Consistency | Todos los nodos devuelven los mismos datos |
| Availability | Las solicitudes siempre devuelven una respuesta |
| Partition Tolerance | Continua operando durante particiones de red |
Ejemplos de Clasificacion
- CP: MongoDB, Redis Cluster
- AP: Cassandra, CouchDB
- CA: RDBMS de nodo unico (dificil de lograr en entornos distribuidos)
Tabla Comparativa
| Aspecto | SQL | NoSQL |
|---|---|---|
| Esquema | Estricto (predefinido) | Flexible (sin esquema) |
| Escalado | Vertical (scale up) | Horizontal (scale out) |
| Consultas | Bueno para JOINs complejos | Bueno para consultas simples |
| Consistencia | Consistencia fuerte | Generalmente consistencia eventual |
| Transacciones | Soporta transacciones complejas | Transacciones limitadas |
Seleccion segun Caso de Uso
Casos Adecuados para SQL
Datos con relaciones complejas (E-commerce, CRM)
Se requiere fuerte consistencia de datos (Finanzas, gestion de inventario)
Muchas consultas y agregaciones complejas
El esquema es estable
Casos Adecuados para NoSQL
Se requiere gran volumen de lectura/escritura (Redes sociales, IoT)
El esquema cambia frecuentemente
Se requiere escalado horizontal
Datos geograficamente distribuidos
Ejemplos Concretos
| Caso de Uso | Recomendado |
|---|---|
| Gestion de pedidos de E-commerce | PostgreSQL, MySQL |
| Gestion de sesiones de usuario | Redis |
| Timeline de redes sociales | Cassandra, MongoDB |
| Analisis en tiempo real | ClickHouse |
| Recomendaciones | Neo4j |
| CMS, Blog | MongoDB |
| Datos de sensores IoT | TimescaleDB, InfluxDB |
Persistencia Poliglota
Enfoque que utiliza multiples bases de datos en una sola aplicacion.
flowchart LR
App["Aplicacion E-commerce"]
App --> PG["PostgreSQL<br/>Productos, Pedidos, Clientes"]
App --> Redis["Redis<br/>Sesiones, Cache"]
App --> ES["Elasticsearch<br/>Busqueda de productos"]
App --> Mongo["MongoDB<br/>Resenas de productos, Contenido"]
Resumen
La eleccion de base de datos se basa en las caracteristicas de los datos, requisitos de escalabilidad y requisitos de consistencia. SQL y NoSQL tienen una relacion de compensacion, ninguno es mejor que el otro. Usarlos adecuadamente segun el proposito y combinar multiples bases de datos cuando sea necesario permite lograr una arquitectura optima.
← Volver a la lista