Curso exprés · No. 06
Los lenguajes y los frameworks van y vienen. Los datos que guardás, y la forma en que los guardás, pueden sobrevivirlos a todos — así que elegir una base de datos es elegir cómo recuerda tu sistema, y qué tan difícil es hacerle cambiar de opinión.
20 conceptos · un diagrama para cada uno · hoja de referencia al final
Una base de datos es la memoria de largo plazo de tu sistema. El código se reescribe; los datos, y la forma que elegiste para ellos, suelen sobrevivir a todo lo que los rodea.
Los datos sobreviven al código
Una casa se repinta, se reamuebla, hasta se le rehace el techo a lo largo de décadas — pero los cimientos que se vertieron el primer día se quedan, porque reemplazarlos significa levantar la casa entera.
Los lenguajes cambian, los frameworks se intercambian, la UI se redibuja diez veces. Los datos y su estructura normalmente se quedan, porque cambiarlos en un sistema vivo lleno de registros reales es lento y riesgoso. Así que la base de datos es lo primero en lo que hay que pensar a fondo, y lo último que conviene apurar.
Una base de datos responde dos preguntas
Elegir dónde guardar las cosas plantea dos cuestiones: qué forma tienen las cosas — ¿libros en estantes, o herramientas raras en ganchos? — y qué tan seguras deben estar — ¿una bóveda, o un cajón a mano?
Todo almacén se define por dos cosas. Primero, su modelo de datos: cómo le da forma a los datos — tablas rígidas, documentos flexibles, un grafo de enlaces. Segundo, sus garantías: corrección estricta, o velocidad y disponibilidad con promesas más laxas. Casi toda elección de base de datos es una respuesta distinta a esas dos — y el resto de este curso es el menú.
Access pattern — elegí por cómo leés y escribís
Un archivador, un fichero de catálogo y una cinta transportadora son todos «almacenamiento» — pero elegís por cómo vas a buscar las cosas, no por cuál parece más nuevo.
No hay una mejor base de datos. Un almacén perfecto para búsquedas rápidas por clave es el equivocado para consultas de relaciones profundas; uno construido para escrituras enormes es el equivocado para transacciones bancarias estrictas. La pregunta correcta es tu patrón de acceso (access pattern): qué leés, qué escribís, con qué frecuencia, y cómo debe comportarse cuando las cosas salen mal.
El mapa: 20 conceptos en seis grupos
Un mapa de metro: primero ves las líneas enteras, después viajás estación por estación.
Los conceptos de este curso se dividen en seis grupos: el núcleo relacional, la familia NoSQL, los almacenes especializados, las garantías, las técnicas de escalado y cómo combinarlo todo.
Cada concepto de abajo recibe el mismo trato: su nombre en inglés (el término con el que vas a buscar en los docs), una imagen de la vida real, un diagrama y una ficha con los campos: problema, idea, ejemplo, coste, cuándo usarlo y relaciones. Al final te espera una hoja de referencia de una página.
El código es fácil de cambiar. Los datos no. Elegí el almacén como una decisión con la que vas a vivir durante años — porque así será.
Para la mayoría de los sistemas el default es la base de datos relacional — y se gana ese default. Empezá acá, y salí solo con una razón.
Relational Database — tablas, filas y relaciones
Una hoja de cálculo bien hecha: cada hoja es un tipo de cosa (clientes, pedidos), cada fila un registro, y los pedidos apuntan de vuelta al cliente al que pertenecen.
Esta es la base de datos relacional (relational database). Guarda los datos en tablas con un esquema fijo, y enlaza tablas por referencia — una fila de pedido contiene el id de su cliente. Esa referencia se llama clave foránea (foreign key). El esquema es una promesa sobre la forma: cada pedido tiene las columnas que debería, verificadas al entrar. Estructura por adelantado, a cambio de cordura más tarde.
- Problema
Datos con estructura y relaciones a los que les vas a hacer muchas preguntas.
- Idea
- Tablas con un esquema fijo; tablas enlazadas mediante claves foráneas.
- Ejemplo
Postgres, MySQL: tablas
customersyorders, cada pedido tiene uncustomer_id.- Coste
El esquema hay que pensarlo por adelantado; cambiarlo con datos vivos da trabajo.
- Cuándo usarlo
Casi siempre, como punto de partida. Salí solo con una razón.
- Relaciones
- Habla SQL, da Transactions y ACID.
SQL — pedí lo que querés, no cómo conseguirlo
Le decís a un bibliotecario «cada novela de autores franceses publicada después de 1950, ordenada por año» — y él se las arregla para encontrarlas. Describís el resultado, no la búsqueda.
SQL (Structured Query Language) es un lenguaje de consultas declarativo: enunciás la respuesta que querés y la base de datos planifica cómo obtenerla, incluida la unión de tablas (JOIN). Ese plan lo arma el planificador de consultas (query planner). SELECT ... JOIN ... WHERE ... puede responder preguntas que nunca anticipaste al diseñar — uno de los superpoderes silenciosos del modelo relacional.
- Problema
- Necesitás hacerle preguntas a los datos sin programar a mano cada búsqueda.
- Idea
Describí el resultado; la base de datos elige el plan (índices, joins, ordenamiento).
- Ejemplo
SELECT title FROM books JOIN authors ... WHERE country = 'FR' AND year > 1950 ORDER BY year.- Coste
Las consultas complejas hay que leerlas con cuidado, y verificar cómo las ejecuta realmente la base de datos.
- Cuándo usarlo
- Dondequiera que haya una base de datos relacional — es su lengua nativa.
- Relaciones
- El lenguaje de una Relational Database; se vuelve rápido gracias a un Index.
Transactions — todo o nada
Una transferencia de dinero son dos escrituras — menos acá, más allá — pero una sola intención. O pasan las dos o ninguna; una transferencia a medias es un desastre.
Esta es la transacción (transaction): un grupo de cambios que o se confirma (commit) por completo o se revierte (rollback) por completo, aislado de los demás, y que sobrevive a una caída una vez confirmado. El conjunto de esas promesas se llama ACID (más en el capítulo 5). Por eso bancos, pedidos e inventarios viven en SQL — cuando la corrección importa más que la velocidad cruda, querés esta promesa.
- Problema
- Una acción son varias escrituras; una caída a la mitad deja basura.
- Idea
- Envolvé las escrituras en
BEGIN … COMMIT: se guardan todas, o ninguna. - Ejemplo
- Una transferencia:
A − 100yB + 100en una sola transacción. - Coste
- Algo de velocidad, y un escalado más difícil entre máquinas.
- Cuándo usarlo
Dinero, pedidos, inventario — donde un número equivocado es inaceptable.
- Relaciones
- Las propiedades de una transacción son ACID.
Por qué es el default correcto
Una buena herramienta de uso general: no es la más rápida en ninguna tarea concreta, pero es la que agarrás hasta que una tarea exige otra cosa.
Datos estructurados, relaciones reales, consultas ad hoc, garantías fuertes — la base de datos relacional hace todo eso bien, y el Postgres moderno también maneja JSON, búsqueda de texto completo e incluso vectores. Empezá todo proyecto acá; buscá otra cosa solo cuando un dolor concreto — escala, forma o patrón de acceso — te empuje a salir.
Empezá con Postgres. La pregunta no es «por qué SQL» — es si tenés una razón real para no usarlo.
A veces la tabla rígida es la forma equivocada. «NoSQL» es en realidad una familia de almacenes, cada uno doblando las reglas en una dirección distinta para un trabajo distinto.
Document Store — un documento JSON por cosa
Una carpeta de formularios completados, donde cada formulario puede tener campos un poco distintos — sin una plantilla central que obligue a todos a coincidir.
Este es el almacén documental (document store). Guarda los registros como documentos tipo JSON flexibles, anidados y sin esquema (schema-less), así que dos registros de una misma colección (collection) pueden ser distintos. Es genial cuando las formas varían o evolucionan rápido, y una cosa entera — un producto, un perfil — vive como un solo documento que traés en una única lectura.
- Problema
Las formas de los registros difieren o cambian rápido; la tabla estorba.
- Idea
Cada cosa es un documento JSON anidado, sin un esquema rígido compartido.
- Ejemplo
- MongoDB: un catálogo de productos, perfiles de usuario.
- Coste
- Menos garantías y consultas entre documentos más difíciles que en SQL.
- Cuándo usarlo
Una cosa se lee entera, y distintos registros tienen distintos campos.
- Relaciones
Postgres también maneja documentos (JSONB); a menudo vive bajo las reglas de BASE.
Key-Value Store — un hash map gigante
Un guardarropa — entregás un número de ticket, te devuelven exactamente tu abrigo. Sin buscar, sin preguntas, al instante.
Este es el almacén clave-valor (key-value store) — la forma más simple: entra una clave, sale un valor, a una velocidad endiablada. Perfecto para caché, sesiones, contadores de rate-limit y todo lo que se trae por un id conocido.
- Problema
- Necesitás recuperar datos muy rápido por un id conocido.
- Idea
- Clave → valor, como un hash map gigante.
- Ejemplo
Redis, DynamoDB:
session:42, una caché de páginas, un contador de rate-limit.- Coste
- Solo podés buscar por clave — sin consultas ricas sobre los valores.
- Cuándo usarlo
Caché, sesiones, contadores — todo donde el id se conoce de antemano.
- Relaciones
El típico «ayudante rápido» junto a la base de datos principal en Polyglot persistence.
Wide-Column Store — hecho para escrituras enormes
Un depósito inmenso con pasillos idénticos sin fin, dispuesto para que mil montacargas llenen estantes a la vez sin chocarse.
Este es el almacén wide-column. Reparte los datos entre muchas máquinas según una clave de partición (partition key) para lograr un rendimiento y una escala de escritura masivos, a cambio de consultas ricas y consistencia estricta, para poder absorber una manguera de datos. Potente — y más trabajo operativo para hacerlo andar bien.
- Problema
- Tantas escrituras que una sola máquina SQL se doblaría.
- Idea
Repartí los datos entre muchos nodos por clave de partición; escribí en paralelo.
- Ejemplo
- Cassandra: logs de eventos, telemetría, feeds a escala.
- Coste
- Sin consultas ricas ni consistencia estricta; más difícil de operar.
- Cuándo usarlo
Una manguera de escrituras, con consultas conocidas de antemano y simples.
- Relaciones
Básicamente Sharding incorporado; normalmente vive bajo BASE.
Graph Database — cuando los vínculos son lo importante
El tablero de un detective — fotos conectadas con hilo. El valor no está en ninguna foto; está en la red de quién se ata con quién.
Esta es la base de datos de grafos (graph database). Modela los datos como nodos y las aristas (edges) entre ellos, y hace que las consultas de relaciones — «amigos de amigos a los que les gusta esto», «el camino entre estas dos cuentas» — sean naturales y rápidas, donde SQL necesitaría dolorosos joins de muchos niveles. Recurrí a ella cuando las conexiones importan más que los registros.
- Problema
Las preguntas principales son sobre vínculos, y en SQL se vuelven JOINs de muchos pisos.
- Idea
Nodos y aristas son datos de primera clase; una consulta recorre las aristas.
- Ejemplo
- Neo4j: grafos sociales, recomendaciones, detección de fraude.
- Coste
- Un nicho estrecho; incómoda para registros y reportes ordinarios.
- Cuándo usarlo
- Las conexiones importan más que los registros.
- Relaciones
Una alternativa a la Relational Database cuando los JOINs se vuelven el dolor.
NoSQL no es «un SQL más nuevo». Cada almacén suelta una garantía para ganar algo concreto — sabé cuál estás cambiando.
Más allá de los almacenes generales hay bases de datos hechas para un solo trabajo, donde un motor diseñado a propósito le gana por mucho a uno general.
Time-Series Database — datos marcados por el reloj
La cinta de un monitor cardíaco — una tira interminable de lecturas, cada una atada a un momento, donde casi siempre preguntás «¿qué pasó entre estas dos horas?»
Esta es la base de datos de series temporales (time-series database). Está afinada para datos que llegan en orden temporal y se consultan por tiempo — métricas, lecturas de sensores, precios. Ingiere flujos enormes y responde rápido «promedio por minuto de la última semana», con expiración integrada de los datos viejos (retention).
- Problema
Un flujo enorme de lecturas, y cada pregunta es «qué pasó en este período».
- Idea
- Guardá e indexá por tiempo; agregá ventanas rápido.
- Ejemplo
- InfluxDB, TimescaleDB: métricas de servidores, sensores, precios.
- Coste
Un almacén más que operar; mala opción para datos de negocio ordinarios.
- Cuándo usarlo
Todo tiene una marca de tiempo, y el tiempo es el eje principal.
- Relaciones
- TimescaleDB es una extensión de Postgres — ver Postgres first.
Search Engine — texto completo y relevancia
Un cuadro de búsqueda que perdona los errores de tipeo, pone primero las mejores coincidencias, y encuentra «corriendo» cuando escribiste «correr» — como un bibliotecario que sabe lo que quisiste decir.
Este es el motor de búsqueda (search engine). Construye un índice invertido (inverted index) — «palabra → documentos» — para una búsqueda de texto completo rápida, con ranking, coincidencia aproximada y filtros: lo que un LIKE '%palabra%' de SQL hace lento y mal. Suele correr junto a tu base de datos principal, mantenido en sincronía, y alimenta la barra de búsqueda y la exploración de logs.
- Problema
LIKE '%palabra%'es lento, no perdona errores de tipeo y no ordena por relevancia.- Idea
- Un índice invertido de palabras, más una puntuación de relevancia.
- Ejemplo
Elasticsearch, OpenSearch: la barra de búsqueda de un sitio, exploración de logs.
- Coste
- Hay que mantenerlo en sincronía con la base de datos principal.
- Cuándo usarlo
Los usuarios buscan por texto y esperan una búsqueda «inteligente».
- Relaciones
No es la fuente de verdad — una lente rápida sobre ella; parte de Polyglot persistence.
Vector Database — búsqueda por significado
En vez de coincidir con palabras exactas, preguntás «buscame cosas que se sientan como esta» — y devuelve vecinos por similitud, no por palabra clave.
Esta es la base de datos vectorial (vector database). Guarda embeddings — huellas numéricas del significado — y encuentra los vecinos más cercanos (nearest neighbours), así que podés buscar por similitud en vez de por texto exacto. Es el motor debajo de la búsqueda semántica y de RAG, donde una app de IA recupera los fragmentos más relevantes para responder.
- Problema
Necesitás cosas parecidas en significado, pero las palabras pueden no coincidir.
- Idea
- Guardá embeddings y buscá los vecinos más cercanos.
- Ejemplo
pgvector, Pinecone: la consulta «política de reembolso» encuentra «devoluciones» y «dinero de vuelta».
- Coste
Necesita un modelo de embeddings, y sincronizarse con los datos de origen.
- Cuándo usarlo
Búsqueda semántica y RAG — el nuevo almacén esencial de la era de la IA.
- Relaciones
pgvector es una extensión de Postgres; una copia de los datos, como un Search Engine.
Object Storage — adonde van los archivos grandes
Un guardamuebles — no para fichas, sino para los muebles: cosas voluminosas que guardás con una etiqueta y sacás enteras.
Este es el almacenamiento de objetos (object storage). No es una base de datos, pero es donde viven los blobs grandes — imágenes, video, backups, documentos — direccionados por una clave dentro de un bucket y servidos barato a escala. El patrón es casi universal: guardá el archivo en el almacenamiento de objetos, guardá en tu base de datos una fila que apunte a él. Los registros en la base de datos, las cargas en el bucket.
- Problema
Los archivos grandes dentro de la base de datos la inflan y son caros de servir.
- Idea
El archivo va a un bucket por clave; la base de datos guarda solo una fila con esa clave.
- Ejemplo
- S3 y sus parientes: fotos, video, backups, documentos.
- Coste
No es una base de datos: sin consultas sobre el contenido, solo «put/get por clave».
- Cuándo usarlo
- Cualquier archivo grande.
- Relaciones
Con la forma de un Key-Value Store, pero para cosas voluminosas.
No fuerces a tu base de datos principal a ser un motor de búsqueda o un servidor de archivos. Poné el trabajo especializado en el almacén hecho para eso.
La elección más profunda de una base de datos no es su forma — es lo que promete cuando las cosas salen mal. Una pequeña sopa de letras nombra ese intercambio.
ACID — pesimista, correcto, cuidadoso
Un cajero de banco que revisa dos veces cada asiento y no sigue hasta que los libros cuadran — más lento, pero nunca se equivoca.
ACID es la promesa estricta que hacen las bases de datos relacionales sobre las transacciones: toda transacción deja los datos correctos y completos, o no ocurre en absoluto. Cuatro letras: Atomicity (todo o nada), Consistency (las reglas de los datos siempre se cumplen), Isolation (las transacciones concurrentes no se estorban), Durability (lo confirmado sobrevive a una caída). Para dinero, pedidos y todo donde un número equivocado es inaceptable, este es el intercambio que querés.
- Promesa
- Toda transacción es totalmente correcta, o no ocurrió en absoluto.
- Ejemplo
Una transferencia bancaria, hacer un pedido, sacar stock del inventario.
- Coste
- Algo de velocidad, y un escalado más difícil entre máquinas.
- Cuándo usarlo
- Un número equivocado es inaceptable.
- Relaciones
Las propiedades de una Transaction; la postura opuesta es BASE.
BASE — optimista, disponible, correcto con el tiempo
Un negocio concurrido que deja que todos sigan comprando incluso mientras se actualizan las etiquetas de precio — los números se ponen al día en un momento, y está bien.
Muchos sistemas NoSQL toman la postura opuesta: BASE (Basically Available, Soft state, Eventually consistent). Se mantienen rápidos y disponibles y aceptan que las copias de los datos pueden discrepar brevemente antes de converger. Esto se llama consistencia eventual (eventual consistency).
- Promesa
- El sistema siempre responde; las copias convergen «con el tiempo».
- Ejemplo
- Un contador de likes, un feed, un contador de vistas.
- Coste
- Puede que veas brevemente un valor desactualizado.
- Cuándo usarlo
La disponibilidad pesa más que la precisión instantánea, y un segundo de desactualización no cuesta nada.
- Relaciones
- Lo opuesto a ACID; la elección «A» en CAP.
CAP Theorem — elegí cuando la red se rompe
Un equipo partido por una línea telefónica caída: cada mitad puede seguir trabajando sola (pero van a divergir), o dejar las herramientas hasta reconectarse (pero se paran). No se puede tener las dos cosas.
El teorema CAP dice que cuando una partición de red (network partition) separa las máquinas de tu base de datos, tenés que elegir Consistency (rechazar escrituras, seguir siendo correcto) o Availability (seguir sirviendo, arriesgando desacuerdo) — no podés tener las dos durante la separación. Toda base de datos distribuida toma esta decisión. Saber cuál elige tu almacén te dice cómo se comporta en su peor día.
- Dice
Durante una separación de red no podés ser a la vez correcto y disponible.
- Ejemplo
Dos nodos pierden contacto: rechazar la escritura (CP), o aceptarla en los dos y reconciliar después (AP).
- Coste
- CP — caída del servicio; AP — datos desactualizados o en conflicto.
- Cuándo pensarlo
- Apenas tus datos viven en más de una máquina.
- Relaciones
Lo plantean Replication y Sharding; el lado AP es BASE.
ACID para el dinero, BASE para los likes. La garantía que necesitás la fija el costo de equivocarte por un rato.
Un puñado de técnicas convierte una base de datos de una caja única y frágil en algo rápido y capaz de sobrevivir. Las vas a conocer todas.
Index — el índice de un libro, para los datos
Para encontrar una palabra en un libro de 900 páginas no leés cada página — vas al índice del final y saltás directo.
Un índice (index) es una estructura auxiliar que convierte un escaneo completo de la tabla (full table scan) en una búsqueda directa — la mayor palanca sobre la velocidad de lectura. La trampa: cada índice cuesta almacenamiento y hace más lentas las escrituras (cada insert también tiene que actualizarlo).
- Problema
Una consulta lee toda la tabla, y se vuelve más lenta a medida que crecen los datos.
- Idea
Una estructura auxiliar ordenada sobre una columna → una búsqueda directa de la fila.
- Ejemplo
Un índice sobre
email: encontrar un usuario sin escanear toda la tabla.- Coste
- Espacio en disco, y cada escritura se vuelve más lenta.
- Cuándo usarlo
En las columnas por las que realmente filtrás y ordenás — no en todas, por las dudas.
- Relaciones
Acelera SQL; un motor de búsqueda es un índice especial sobre texto.
Replication — guardá copias, sobreviví a las fallas
Un documento guardado en tres cajas fuertes en tres edificios — si uno se incendia, los otros lo conservan, y tres personas pueden leerlo a la vez.
La replicación (replication) mantiene copias de los datos en varias máquinas. Todas las escrituras van al líder (leader), y los seguidores (réplicas) reciben una copia y sirven lecturas. Si el líder muere, un seguidor toma su lugar (failover). La trampa es el retraso de replicación (replication lag): un seguidor puede ir un momento atrasado, así que un valor que acabás de escribir puede no aparecer todavía en una réplica.
- Problema
Una máquina es un punto único de falla y un único techo para las lecturas.
- Idea
Los mismos datos en varias máquinas: el líder escribe, los seguidores leen.
- Ejemplo
Postgres con dos réplicas de lectura; si el líder cae, una réplica pasa a ser líder.
- Coste
Retraso: una escritura reciente puede no haber llegado todavía a la réplica.
- Cuándo usarlo
Necesitás confiabilidad, o más lecturas de las que una máquina puede servir.
- Relaciones
Copia los mismos datos; Sharding divide datos distintos. Ambos llevan a CAP.
Sharding — dividí cuando una caja no alcanza
Un archivador desbordado se vuelve A–M en un archivador y N–Z en otro. Más lugar — pero ahora tenés que saber en qué archivador vive cada nombre.
Cuando los datos o la carga de escritura superan a una sola máquina, el sharding divide los datos entre muchas — los usuarios A–M acá, N–Z allá. Cada parte es un shard, y el campo por el que dividís es la clave de sharding (shard key). Abre una escala casi ilimitada, pero la clave de sharding es una elección difícil y casi permanente: si elegís mal, tenés hotspots, o consultas que tienen que tocar todos los shards.
- Problema
- Los datos o el flujo de escritura no caben en una sola máquina.
- Idea
- Dividí los datos por una clave entre muchas máquinas.
- Ejemplo
- Usuarios A–M en el shard 1, N–Z en el shard 2.
- Coste
La clave es casi permanente; una mala clave → hotspots, o consultas a través de todos los shards.
- Cuándo usarlo
- Al final: después de los índices y las réplicas.
- Relaciones
Incorporado en un Wide-Column Store; junto con Replication lleva a CAP.
Normalization / Denormalization — un dato en un lugar, o copias por velocidad
Una lista maestra de direcciones a la que todos se refieren (sin contradicciones) frente a engrapar una copia de la dirección en cada pedido (más rápido de leer, pero ahora hay copias que mantener honestas).
La normalización (normalization) guarda cada dato en exactamente un lugar — limpio, sin contradicciones, el default relacional. La desnormalización (denormalization) duplica datos a propósito para que las lecturas sean más rápidas y necesiten menos joins. Las dos son válidas; la regla es hacerlo de forma consciente, y saber siempre cuál copia es la fuente de verdad y cuál es solo un duplicado rápido. (La misma lección que con una caché.)
- Problema
El mismo dato en varios lugares se desincroniza; pero los joins hacen más lentas las lecturas.
- Idea
Normalizá por defecto; desnormalizá a propósito donde las lecturas importan más.
- Ejemplo
Una dirección en una tabla
addressesvs una copia de ella en cada pedido.- Coste
Normalización — más JOINs; desnormalización — copias que hay que mantener sincronizadas.
- Cuándo usarlo
- Desnormalizá cuando lecturas medidas como lentas lo exijan.
- Relaciones
La misma idea de «fuente de verdad + copias rápidas» que Polyglot persistence.
Agregá un índice antes que un servidor, una réplica antes que un shard. El escalado más barato es el que no tenés que operar.
No elegís una base de datos y metés todo en ella a la fuerza. Los sistemas reales usan unas pocas, cada una para el trabajo en el que es mejor.
Polyglot Persistence — varios almacenes, a propósito
Una cocina tiene heladera, freezer y alacena — no una sola caja obligada a hacer las tres cosas. Cada una guarda lo que le corresponde.
Este es el patrón de persistencia políglota (polyglot persistence). Los sistemas maduros suelen usar varios almacenes: Postgres como fuente de verdad, Redis para caché y sesiones, un índice de búsqueda para la barra de búsqueda, quizás un almacén vectorial para las funciones de IA y almacenamiento de objetos para los archivos. Cada almacén hace lo que mejor sabe. La disciplina es tener claro cuál guarda la verdad, con los demás como copias rápidas mantenidas en sincronía.
- Problema
- Ninguna base de datos puede ser la mejor en todo.
- Idea
- Cada trabajo tiene su propio almacén; una fuente de verdad explícita.
- Ejemplo
- Postgres + Redis + un índice de búsqueda + un almacén vectorial + S3.
- Coste
- Cada almacén hay que operarlo, respaldarlo y mantenerlo consistente.
- Cuándo usarlo
- Cuando un dolor real exige otro almacén — no «por las dudas».
- Relaciones
Parte de Postgres first; une casi todos los almacenes del curso.
Postgres First — empezá con Postgres, salí de él a propósito
Una navaja suiza resuelve una cantidad sorprendente de cosas antes de que necesites la caja de herramientas completa.
Esta es la práctica de Postgres first. El Postgres moderno es asombrosamente capaz — núcleo relacional, documentos JSON, búsqueda de texto completo, vectores, incluso una cola de trabajos que funciona. La mayoría de los productos deberían empezar solo con Postgres y agregar un almacén especializado únicamente cuando un dolor real y medido lo exija. Cada base de datos extra es una cosa más que operar, respaldar y mantener consistente. El almacén más barato es el que no agregaste.
- Problema
- Los equipos agregan bases de datos antes de que aparezca el dolor.
- Idea
- Un Postgres, hasta que un problema medido exija más.
- Ejemplo
JSONB en vez de un almacén documental aparte, pgvector en vez de una base de datos vectorial aparte.
- Coste
- A escalas muy grandes un motor especializado igual va a ganar.
- Cuándo usarlo
- Al comienzo de casi cualquier producto.
- Relaciones
El primer paso hacia Polyglot persistence — una vez que el «por ahora» terminó.
Cómo se conecta todo
Un mapa del barrio después de una larga caminata: ahora ves qué calles llevan adónde.
Los conceptos de este curso no viven solos. La base de datos relacional es la fuente de verdad con garantías ACID; un índice acelera sus lecturas; el motor de búsqueda y la base de datos vectorial son copias alimentadas desde ella; el almacenamiento de objetos guarda los archivos a los que apuntan sus filas. Cuando una máquina no alcanza, llegan la replicación y el sharding — y con ellos la elección de CAP. La familia NoSQL suele elegir BASE — lo opuesto a ACID.
- Qué forma tienen los datos — ¿tablas, documentos, clave-valor, un grafo?
- Cómo los voy a consultar — ¿por id, por relaciones, por texto, por similitud, por tiempo?
- Qué garantías necesito — ¿ACID estricto, o la consistencia eventual alcanza?
- Cuál es el equilibrio lectura/escritura y la escala aproximada.
- Podría Postgres ya hacer esto antes de que agregue otro almacén.
- Qué almacén guarda la fuente de verdad, y cuáles son solo copias.
- Usás
LIKE '%...%'para buscar en vez de un motor de búsqueda. - Un almacén clave-valor donde constantemente necesitás consultar por los valores.
- Cinco bases de datos para un producto que mantienen dos personas.
- Elegiste MongoDB para evitar esquemas, y de todos modos reconstruiste la validación a mano.
- Sin una fuente de verdad clara — dos almacenes que se dicen autoritativos.
- La consulta que más ejecutás es en la que el almacén es más rápido.
- La garantía coincide con lo que está en juego — estricta para el dinero, relajada para los likes.
- Podés nombrar la fuente de verdad de cada dato importante.
- Agregaste cada almacén para resolver un dolor real y sentido, no uno hipotético.
- Podrías explicar el modelo de datos a un ingeniero nuevo en pocos minutos.
Hoja de referencia: los 20 conceptos
El núcleo relacional
- Relational DatabaseRDBMS
Tablas con un esquema fijo, enlazadas por claves foráneas. El default.
- SQLlenguaje de consultas
Describí lo que querés; la base de datos decide cómo obtenerlo.
- Transactiontodo o nada
Varias escrituras como una unidad: COMMIT de todas o ROLLBACK de todas.
La familia NoSQL
- Document Storebase de datos documental
Documentos JSON flexibles; una cosa se lee entera.
- Key-Value Storeclave → valor
Clave → valor, al instante. Caché, sesiones, contadores.
- Wide-Column Storecolumn-family
Datos repartidos entre muchas máquinas para absorber una manguera de escrituras.
- Graph Databasegraph store
Nodos y aristas; consultas de relaciones sin JOINs dolorosos.
Almacenes especializados
- Time-Series DatabaseTSDB
Lecturas por tiempo; consultas por ventana, los datos viejos expiran.
- Search Enginebúsqueda de texto completo
Búsqueda de texto completo con ranking y tolerancia a errores de tipeo. Una copia, no la verdad.
- Vector Databasevector store
Embeddings y búsqueda del más cercano por significado. La base de RAG.
- Object StorageS3
Archivos grandes por clave en un bucket; la base de datos guarda solo un puntero.
Garantías
- ACIDla promesa estricta
Una transacción es totalmente correcta o no ocurrió. Para el dinero.
- BASEconsistencia eventual
Siempre disponible, las copias convergen con el tiempo. Para los likes.
- CAP Theoremelegí C o A
Durante una separación de red — o corrección o disponibilidad.
Escala
- IndexB-tree index
Un puntero para lecturas rápidas; el coste es espacio y escrituras más lentas.
- Replicationlíder–seguidor
Los mismos datos en muchas máquinas: confiabilidad y lecturas. Hay retraso.
- Shardingparticionado horizontal
Datos distintos en máquinas distintas según una clave. La clave es casi permanente.
- Normalization / Denormalizationun lugar vs copias
Un dato en un lugar — o copias deliberadas por velocidad.
Elegir
- Polyglot Persistencevarios almacenes
Cada trabajo su propio almacén, una fuente de verdad.
- Postgres Firstempezá con Postgres
Un Postgres, hasta que un dolor real exija más.
La mejor decisión de base de datos suele ser «Postgres, por ahora» — más la sabiduría para saber exactamente cuándo ese «por ahora» terminó.