fedorthinks

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

§ 01

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.

Relational (SQL)Relational modelSQLTransactionsNoSQL familyDocumentKey-valueWide-columnGraphSpecialisedTime-seriesSearch engineVector DBObject storageGuaranteesACIDBASECAPScalingIndexReplicationShardingNormalisationChoosingPolyglot persistencePostgres first
Seis grupos de conceptos — los capítulos 2–7 los siguen.

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á.

§ 02

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.

customersidnameemail1Annann@mail.com2Bobbob@mail.comordersidcustomer_idtotal10140.0011115.5012299.00foreign keyschema = fixed columns, checked on the way inorders point back to the customer they belong to
Dos tablas: un pedido contiene customer_id — una clave foránea que apunta a su cliente.
StoreRelational Database· RDBMS
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 customers y orders, cada pedido tiene un customer_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.

you write WHATSELECT title, yearFROM books JOIN authorsWHERE country = 'FR' AND year > 1950ORDER BY yearQuery plannerdecides HOWResultrowsuse indexjoin tablessort by yearthe plan is thedatabase's job
Vos escribís QUÉ querés; el planificador de la base de datos decide CÓMO obtenerlo.
LanguageSQL· lenguaje de consultas
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.

BEGINone transaction = one intentA − 100debitB + 100creditCOMMITboth savedROLLBACKneither saved✗ never: A − 100 saved, B + 100 lost
Una transferencia: el débito y el crédito son una sola transacción. O las dos hacen COMMIT o las dos hacen ROLLBACK.
ConceptTransaction· unidad de todo o nada
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 − 100 y B + 100 en 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.

§ 03

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.

collection: productsdocument 1{ "id": 1, "name": "Mug", "price": 12, "tags": ["kitchen"] }document 2{ "id": 2, "name": "T-shirt", "sizes": ["S", "M", "L"], "color": "blue" }different fields, same collection — no central templateone read returns the whole object
Dos productos en una colección con campos distintos; el producto entero vuelve en una sola lectura.
StoreDocument Store· base de datos documental
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.

GET session:42by known keykey → valuesession:42{ user: 7, cart: 3 }rate:ip:1.2.3.417cache:home<html>…</html>instant, no search✗ no rich queries: “all sessions where cart > 2”
Si sabés la clave, obtenés el valor al instante. Preguntar por los valores no es posible.
StoreKey-Value Store· clave → valor
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.

app 1writesapp 2writesapp 3writeshash(key)partition keyNode 1user:7 → t1 · t2 · t3 · t4 · …Node 2user:10 → t1 · t2 · t3 · t4 · …Node 3user:13 → t1 · t2 · t3 · t4 · …Node 4user:16 → t1 · t2 · t3 · t4 · …writes spread across many machines · wide rows · no joins
La clave de partición reparte las escrituras entre muchas máquinas; las filas son anchas, no hay joins.
StoreWide-Column Store· column-family store
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.

FRIENDFRIENDFRIENDWORKS_WITHLIKESAnnBobDanCaraJazz clubplace“friends of friends who like X” = follow the edges, no joins
“Amigos de amigos a los que les gusta X”: solo se recorren las aristas Ann → Bob → Cara → Jazz club.
StoreGraph Database· graph store
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.

§ 04

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).

expired(retention)WHERE time BETWEEN t1 AND t2t1t2time →readings arrive in time order and are asked about by time
Los puntos llegan en orden temporal; una consulta es una ventana de t1 a t2; los datos viejos expiran por retención.
StoreTime-Series Database· TSDB
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.

Postgressource of truthSearch indexElasticsearch“runing shoe”typo + stemmingsyncqueryinverted indexrun → doc 3, doc 7shoe → doc 7, doc 9red → doc 3ranked results1. doc 7 · 0.922. doc 3 · 0.613. doc 9 · 0.40a fast lens onto the data — not the source of truth
Los datos se copian de Postgres a un índice de búsqueda; una consulta con un error de tipeo devuelve una lista ordenada.
StoreSearch Engine· búsqueda de texto completo
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.

“refund policy”query textEmbedding modeltext → numbers[0.12, −0.83, …]vectorrefunds FAQreturnsmoney backpricingcareersoffice mapAPI docsnearest neighbours = closest in meaning
El texto se vuelve un vector; los puntos más cercanos son los textos más próximos en significado.
StoreVector Database· vector store
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.

photos (Postgres)iduser_ids3_key17photos/7/a1.jpg29videos/9/b2.mp4S3 bucketphotos/7/a1.jpg4.2 MB · imagevideos/9/b2.mp4310 MB · videobackups/db.tar12 GB · backuprecords in the DBpayloads in the bucket
La fila de Postgres guarda solo la clave; el archivo en sí vive en un bucket de S3.
StoreObject Storage· S3, blob storage
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.

§ 05

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.

AAtomicityall or nothingCConsistencyrules always holdIIsolationno cross-talkDDurabilitysurvives a crashthe strict promise — for money, orders, inventory
Las cuatro letras de ACID y lo que promete cada una.
GuaranteeACID· Atomicity, Consistency, Isolation, Durability
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).

copies briefly disagreeNode Alikes 10likes 11Node Blikes 10likes 11Node Clikes 10likes 11Convergedeventuallyfast and available now, consistent a moment later
La escritura llega al nodo A de inmediato, y a B y C un poco después. Un momento de desacuerdo, y después todos coinciden.
GuaranteeBASE· Basically Available, Soft state, Eventually consistent
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.

Node 1has dataNode 2has data✗partitionthe network split — pick one:CP — Consistencyrefuse writes, stay correctAP — Availabilitykeep serving, may divergecost: downtimecost: stale or conflicting data
La red se rompió: o CP (rechaza, pero sigue correcto) o AP (sigue trabajando, pero puede divergir).
TheoremCAP Theorem· Consistency, Availability, Partition tolerance
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.

§ 06

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).

WITHOUT INDEXreadallWITH INDEXann@…bob@…cara@…dan@…eve@…sorted lookuptable rowsfast reads · but costs space and slows every write
Sin índice la base de datos lee cada fila; con uno salta por una lista ordenada directo a la fila correcta.
TechniqueIndex· B-tree index
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.

AppwritesLeaderall writesFollower 1serves readsFollower 2serves readsFollower 3serves readscopylag: a moment behindleader dies → a follower takes oversame data, many machines: survive failure, spread reads
El líder recibe las escrituras y envía copias; los seguidores sirven lecturas y toman el mando si el líder cae.
TechniqueReplication· líder–seguidor
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.

AppRoutershard key: nameShard 1users A–MShard 2users N–Z“Ann”“Zoe”different data on eachbad key → hotspots, or queries that hit every shard
El router lee la clave: “Ann” va al shard 1, “Zoe” al shard 2. Cada shard guarda datos distintos.
TechniqueSharding· particionado horizontal
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é.)

NORMALISEDorder 10order 11order 12address #51 Main StDENORMALISEDorder 10 · 1 Main Storder 11 · 1 Main Storder 12 · 1 Main Steach fact in one place · needs joinsfast reads · copies to keep honest
Izquierda: cada pedido apunta a una única dirección. Derecha: la dirección se copia dentro de cada pedido.
TechniqueNormalization / Denormalization· un lugar vs copias rápidas
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 addresses vs 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.

§ 07

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.

Your appPostgressource of truthRediscache · sessionsSearchsearch barVector DBAI featuresS3filesdashed = fast copies kept in sync from the source of truth
Cinco almacenes, cada uno para su trabajo. La verdad vive en Postgres; el resto son copias.
PatternPolyglot Persistence· varios almacenes en un sistema
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.

Postgresone store to runRelationaltables + SQLJSONBdocumentsFull-text searchtsvectorpgvectorembeddingsJob queueSKIP LOCKED+ Redis, Elastic…only on measured painstart here · add a store only when a real pain demands it
Un solo Postgres cubre tablas, documentos, búsqueda, vectores y una cola. Un almacén nuevo solo ante un dolor real.
PracticePostgres First· empezá con Postgres
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.

Search enginesynced copyVector DBsynced copyObject storagefiles by keyIndexspeeds readsRelational DBsource of truth · ACIDScale-outreplicas · shardsNoSQL familydoc · KV · wide · graphBASEeventually consistentCAPC or A on a splitfeedsfeedsrows point togrowsforcesoftenopposite of ACID
Los vínculos principales entre los conceptos del curso: la fuente de verdad está en el centro.
Antes de elegir una base de datos
  • 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.
Señales de que elegiste mal
  • 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.
Señales de que elegiste bien
  • 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ó.

Fin del curso exprés · 7 capítulos · 20 conceptos

Lo que sigue es la profundidad: Designing Data-Intensive Applications de Martin Kleppmann es el único libro para leer, junto a los docs de Postgres y el manual propio de tu almacén. Pero antes del fondo profundo — imaginá cómo se van a leer, escribir y confiar tus datos. La base de datos es donde tu sistema recuerda; elegí cómo recuerda antes de elegir con qué está construido.