1. Bases de Datos
Sistemas de almacenamiento estructurado para datos persistentes, relacionales y no relacionales.
1.1 🎯 Elegir Base de Datos
Qué: Decisión arquitectónica fundamental sobre cómo persistir datos.
Por qué: Cada tipo optimiza diferentes trade-offs (ACID, escalabilidad, flexibilidad).
Quién: Arquitectos, DBAs, tech leads.
Esfuerzo: Decisión crítica difícil de revertir. Evaluar con PoC.
1.2 🗄️ SQL (Relacionales)
Qué: Bases con esquema fijo, relaciones explícitas, ACID garantizado.
Por qué: Integridad referencial, transacciones complejas, queries potentes.
| DB |
Qué |
Por qué |
Cuándo |
Trade-offs |
| PostgreSQL |
RDBMS open-source más avanzado |
JSONB, full-text search, extensiones |
Default para apps modernas |
✅ Feature-rich, performance; ❌ Scaling vertical |
| MySQL |
RDBMS popular, ecosistema maduro |
Simplicidad, InnoDB engine |
WordPress, apps web tradicionales |
✅ Simple, ampliamente conocido; ❌ Menos features que PostgreSQL |
| SQL Server |
RDBMS de Microsoft |
Integración .NET, herramientas enterprise |
Ecosistema Microsoft |
✅ Herramientas gráficas potentes; ❌ Licencia costosa |
| Oracle |
RDBMS enterprise líder |
Features avanzadas, soporte 24/7 |
Grandes corporaciones, compliance |
✅ Robusto, compliance; ❌ Muy costoso |
| MariaDB |
Fork de MySQL con mejoras |
Drop-in replacement MySQL |
Migrar desde MySQL |
✅ Open source puro; ❌ Comunidad más pequeña |
1.3 📄 NoSQL
Qué: Bases schema-less, escalabilidad horizontal, eventual consistency.
Por qué: Flexibilidad de esquema, performance en lecturas masivas.
1.3.1 Document Stores
| DB |
Qué |
Cuándo |
Caso de Uso |
| MongoDB |
Documentos JSON con índices |
Esquema flexible, prototipos rápidos |
CMS, catálogos, perfiles usuario |
| CouchDB |
Documentos con sync multi-master |
Offline-first, replicación |
Apps móviles con sync |
| Firestore |
Document DB de Google |
Apps móviles, real-time |
Chat, dashboards colaborativos |
1.3.2 Key-Value Stores
| DB |
Qué |
Cuándo |
Caso de Uso |
| Redis |
In-memory con persistencia opcional |
Caching, sesiones, pub/sub |
Cache, rate limiting, leaderboards |
| Memcached |
In-memory puro (no persistencia) |
Cache simple, ultra-rápido |
Cache de objetos |
| DynamoDB |
Key-value serverless de AWS |
Scaling automático, alta disponibilidad |
Apps serverless, IoT |
1.3.3 Columnar
| DB |
Qué |
Cuándo |
Caso de Uso |
| ClickHouse |
Columnar para analítica |
Queries agregadas en TB de datos |
Analytics, logs, eventos |
| Apache Druid |
Real-time analytics |
Queries sub-segundo en streams |
Dashboards en tiempo real |
| Cassandra |
Wide-column distribuida |
Writes masivos, alta disponibilidad |
Time-series, IoT, messaging |
1.3.4 Graph
| DB |
Qué |
Cuándo |
Caso de Uso |
| Neo4j |
Graph DB líder |
Relaciones complejas |
Redes sociales, recomendaciones, fraude |
| ArangoDB |
Multi-model (document + graph) |
Flexibilidad model |
Apps con datos relacionales y grafo |
1.4 ⏱️ Time Series
Qué: Optimizadas para datos con timestamp (métricas, logs, sensores).
| DB |
What |
When |
Features |
| InfluxDB |
Time-series purpose-built |
Métricas, IoT |
Retention policies, downsampling |
| TimescaleDB |
Extensión PostgreSQL |
Ya usas PostgreSQL |
SQL + optimizaciones time-series |
| Prometheus |
Time-series para métricas |
Monitoring |
Pull model, PromQL |
1.5 🔍 Search Engines
Qué: Optimizadas para búsqueda full-text y analítica.
| DB |
What |
When |
Features |
| Elasticsearch |
Search + analytics |
Búsqueda compleja, logs |
Full-text, agregaciones, Kibana |
| Apache Solr |
Search basado en Lucene |
Búsqueda empresarial |
Faceting, highlighting |
| Meilisearch |
Search API-first |
Búsqueda simple, UX |
Typo-tolerant, rápido setup |
1.6 🗃️ Embedded
Qué: Bases livianas embebidas en la aplicación.
| DB |
Qué |
Cuándo |
Caso de Uso |
| SQLite |
SQL embebido, single-file |
Apps móviles, tests, prototipos |
Local storage, demos |
| H2 |
SQL Java embebido |
Tests Java |
In-memory testing |
| LevelDB |
Key-value embebido |
Bases para otras DBs |
Chrome, Bitcoin Core |
1.7 🔄 NewSQL
Qué: SQL con escalabilidad horizontal (mejor de ambos mundos).
| DB |
What |
When |
Trade-offs |
| CockroachDB |
PostgreSQL distribuido |
Global apps, alta disponibilidad |
✅ Geo-distributed; ❌ Latencia mayor |
| Google Spanner |
SQL global con TrueTime |
Transacciones globales |
✅ Consistencia fuerte global; ❌ Costoso |
| YugabyteDB |
PostgreSQL + Cassandra |
PostgreSQL con scale-out |
✅ Compatible PostgreSQL; ❌ Operacionalmente complejo |
1.8 🎯 Decisión según Caso de Uso
| Caso |
Recomendación |
Por qué |
| App web CRUD |
PostgreSQL |
ACID, relaciones, features |
| Analytics |
ClickHouse, BigQuery |
Queries agregadas en TB |
| Cache |
Redis |
In-memory, TTL, estructuras |
| Búsqueda |
Elasticsearch |
Full-text, faceting |
| Real-time |
DynamoDB, Firestore |
Low latency, serverless |
| Graph/Social |
Neo4j |
Traversals eficientes |
| Time-series |
InfluxDB, TimescaleDB |
Retention, downsampling |
| Mobile offline |
SQLite, Realm |
Embedded, sync |
1.9 📐 Diseño de Esquema
1.9.1 SQL
| Principio |
Qué |
Ejemplo |
| Normalización |
Eliminar redundancia |
3NF: sin dependencias transitivas |
| Denormalización |
Duplicar para performance |
Agregar campos calculados |
| Foreign Keys |
Integridad referencial |
user_id REFERENCES users(id) |
| Indexes |
Optimizar queries |
Index en columnas de WHERE, JOIN |
1.9.2 NoSQL
| Principio |
Qué |
Ejemplo |
| Modelar por queries |
Diseñar según lectura |
Duplicar datos si optimiza queries |
| Desnormalizar |
Embeber documentos relacionados |
User con embedded addresses |
| Evitar JOINs |
No hay JOINs eficientes |
Duplicar datos necesarios |
1.10 🔧 Optimización
| Técnica |
Qué |
Cuándo |
Cómo |
| Indexing |
Acelerar búsquedas |
Columnas en WHERE, JOIN |
Evitar sobre-indexar (slow writes) |
| Partitioning |
Dividir tabla en chunks |
Tablas > 10M rows |
Por fecha, rango de IDs |
| Vacuum/Analyze |
Mantener estadísticas |
PostgreSQL periódicamente |
VACUUM ANALYZE automático |
| Connection Pooling |
Reutilizar conexiones |
Siempre |
PgBouncer, HikariCP |
| Query Plan Analysis |
Entender ejecución |
Queries lentos |
EXPLAIN ANALYZE |
1.11 🔒 Transacciones
| Concepto |
Qué |
Ejemplo |
| ACID |
Atomicity, Consistency, Isolation, Durability |
PostgreSQL, MySQL InnoDB |
| Isolation Levels |
Read Uncommitted < Read Committed < Repeatable Read < Serializable |
Trade-off: consistency vs performance |
| Deadlocks |
Dos transacciones esperan mutuamente |
Timeout + retry con exponential backoff |
| Optimistic Locking |
Versionar registros |
UPDATE ... WHERE version = X |
| Pessimistic Locking |
Lock explícito |
SELECT ... FOR UPDATE |
1.12 🔄 Migraciones
| Herramienta |
Qué |
Cuándo |
| Flyway |
Versionado SQL scripts |
Java ecosystem |
| Liquibase |
Migraciones XML/YAML |
Multi-DB support |
| Alembic |
Migraciones Python |
SQLAlchemy projects |
| TypeORM |
Migraciones TypeScript |
Node.js + TypeScript |
Best Practices:
- Migraciones en un solo sentido (forward-only)
- Testear en staging primero
- Migraciones idempotentes
- Backup antes de migrar
1.13 🚫 Anti-patrones
| Anti-patrón |
Problema |
Solución |
| Sin índices |
Full table scans |
Indexar WHERE, JOIN columns |
| Sobre-indexar |
Writes lentos |
Solo índices usados frecuentemente |
| EAV (Entity-Attribute-Value) |
Queries complejas, sin tipado |
Usar JSONB o document DB |
| VARCHAR(255) everywhere |
Desperdicio espacio |
Tamaño apropiado por columna |
| FLOAT para dinero |
Errores de precisión |
DECIMAL o NUMERIC |
| No usar transacciones |
Datos inconsistentes |
Wrap operaciones relacionadas |
1.14 📚 Recursos