1. Skip to content

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