Read in English · Lire en français · Auf Deutsch lesen
Sección 7.2 de 7.8 · Intermedio · 25 min de lectura
Elegir una base de datos: relacional, documental, clave-valor, de columnas, de grafos y de series temporales
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
Una base de datos es una de las partes de un sistema más difíciles de sustituir. En esta lección aprenderás en qué es bueno cada tipo de base de datos y cómo elegir uno a partir de pruebas.
Elegir una base de datos es como elegir dónde guardar las cosas en casa. Un archivador con carpetas etiquetadas conviene para los papeles que cotejas entre sí: una base de datos relacional. Un armario con conjuntos completos de ropa conviene para las cosas que sacas juntas: un almacén documental. Una fila de casilleros numerados es lo más rápido cuando sabes el número: un almacén clave-valor. Y un tablero de corcho con hilos entre chinchetas muestra quién conoce a quién: un grafo. La mayoría de las casas necesitan un archivador y uno o dos muebles especializados, porque cada mueble adicional necesita espacio y alguien que sepa cómo funciona.
Para los datos de negocio, lo relacional sigue siendo la opción por defecto sensata, por cuatro razones. Primera, la propia base de datos aplica las reglas, como que un pago y sus asientos en el libro mayor se confirmen juntos. Segunda, la flexibilidad. No necesitas conocer todas las preguntas futuras cuando diseñas el esquema. Tercera, la madurez: décadas de herramientas para copias de seguridad, replicación y monitorización, e ingenieros que ya la conocen. Cuarta, la amplitud. Los sistemas relacionales modernos también almacenan JSON, buscan texto y encuentran vectores similares, así que una sola base de datos bien gestionada cubre muchas necesidades a escala moderada.
Cada familia de bases de datos organiza los datos de forma distinta, y esa forma decide qué consultas son baratas y cuáles son imposibles. Una base de datos relacional guarda filas en tablas con columnas fijas, vinculadas mediante claves y joins. Un almacén documental guarda cada registro como un documento anidado que se lee como un todo, como la carta de un restaurante. Consultarlo con otra forma es más difícil. Un almacén clave-valor simplemente obtiene y guarda valores por clave. Nunca mira dentro del valor, así que es extremadamente rápido y fácil de repartir entre máquinas. Una base de datos de grafos trata las relaciones como registros de primera clase, lo que conviene para la detección de fraude y las recomendaciones. Una base de datos de series temporales añade mediciones en orden temporal y las consulta por rango. Debajo hay tres más. Los almacenes de columnas anchas manejan volúmenes masivos de escritura, con una tabla diseñada por consulta. Los motores de búsqueda ordenan el texto por relevancia. Los almacenes vectoriales encuentran las coincidencias más cercanas en significado.
Entonces, ¿cómo eliges? Por conjunto de datos, no una sola vez para todo el sistema. Empieza por la forma de los datos y por las consultas que se ejecutarán sobre ellos. Después, la consistencia. Los saldos, las existencias y las reservas necesitan transacciones. Para los me gusta, unos segundos de desactualización son inofensivos. Después, la escala, medida y no adivinada. Un almacén que escala a petabytes no es ninguna ventaja para cincuenta gigabytes. Después, la operación y los conocimientos del equipo. ¿Quién hará sus copias de seguridad, lo actualizará y lo depurará a las tres de la madrugada? Un buen hábito: anota las consultas más importantes y sus latencias objetivo antes de elegir, y prueba con volúmenes realistas, no con mil filas en un portátil.
Ahora, la plataforma de reparto de comida. En el pico recibe unos trescientos pedidos por minuto, tiene veinte mil repartidores conectados y dos mil búsquedas por segundo. El equipo ya opera bien PostgreSQL. Los pedidos y los pagos necesitan transacciones y reglas estrictas, así que van en PostgreSQL. No hay motivos para nada más. Las cartas tienen una forma anidada, pero un almacén documental añadiría una segunda tecnología sin cumplir ningún requisito que PostgreSQL no cumpla. Las ubicaciones de los repartidores son distintas: cinco mil escrituras por segundo, y solo importa la última posición, durante unos treinta segundos. Encaja un almacén clave-valor en memoria con caducidad. La búsqueda recibe un motor de búsqueda, y la analítica un almacén de datos, ambos alimentados desde los sistemas de registro y reconstruibles a partir de ellos. Se descartaron una base de datos de grafos, una base de datos de series temporales separada y el SQL distribuido. Todavía no hay ningún requisito medido que los necesite.
Este es el resultado. Pedidos y Cartas escriben cada uno en su propia base de datos PostgreSQL: los dos únicos sistemas de registro. Las posiciones de los repartidores viven en memoria y caducan a los treinta segundos. Perderlas en un reinicio cuesta un ciclo de actualización. El motor de búsqueda es un índice derivado de las cartas, alimentado por captura de datos de cambios con unos pocos segundos de retardo. Y el almacén de datos tiene horas de antigüedad, por diseño. Todo salvo los dos sistemas de registro es derivado y puede reconstruirse.
Usar distintos almacenes para distintos datos se llama persistencia políglota. Se deriva de forma natural de la base de datos por servicio. Pero cada tipo adicional de base de datos necesita sus propios conocimientos especializados, copias de seguridad, monitorización, actualizaciones y conocimientos para las guardias. Para un equipo pequeño, cinco bases de datos pueden llevar más esfuerzo que el producto. En su ensayo de 2015, Choose Boring Technology, Dan McKinley sostuvo que una empresa solo dispone de unos pocos tokens de innovación para herramientas desconocidas. Así que justifica cada nuevo almacén con un requisito que los demás no pueden cumplir. Y un error habitual: dejar que un índice de búsqueda o una caché se convierta en la única copia de ciertos datos.
La sección completa compara todas las familias y añade una guía de decisión paso a paso. A continuación, en la sección siete punto tres, vemos las transacciones y el aislamiento. Nos vemos allí.
Lo que necesitas saber
- Las bases de datos relacionales siguen siendo la opción por defecto para los datos de negocio porque ofrecen transacciones, restricciones, consultas flexibles, herramientas maduras y conocimientos ampliamente disponibles, y ahora también manejan datos JSON, de texto, geoespaciales y vectoriales a escala moderada.
- Los almacenes documentales, clave-valor, de columnas anchas, de grafos, de series temporales, de búsqueda y vectoriales hacen baratos ciertos patrones de acceso y caros otros; destacan como almacenes especializados o derivados.
- El SQL distribuido (Spanner, CockroachDB, YugabyteDB, TiDB) mantiene SQL y las transacciones al tiempo que escala entre nodos y regiones, a costa de latencia de escritura, dinero y complejidad operativa.
- Elige para cada conjunto de datos a partir de pruebas: forma de los datos, patrones de acceso, necesidades de consistencia, escala medida, carga operativa y conocimientos del equipo; anota primero las consultas y los volúmenes clave.
- Separa los sistemas de registro, que necesitan la tecnología más conservadora, de los almacenes derivados, como los índices de búsqueda y las cachés, que pueden ser especializados porque pueden reconstruirse.
- La persistencia políglota permite que cada conjunto de datos use un almacén adecuado, pero cada tecnología adicional añade un costo operativo y cognitivo duradero; el ensayo de McKinley 'Choose Boring Technology' (2015) aboga por gastar la innovación con moderación.
Por qué la elección merece atención
Una base de datos es uno de los componentes más difíciles de sustituir. Las aplicaciones se reescriben en torno a sus datos, no al revés; migrar terabytes de datos vivos mientras el negocio sigue funcionando puede llevar un año. Por eso, la elección del almacén es una puerta de un solo sentido que merece una decisión explícita, mientras que muchos equipos la toman por costumbre o por moda.
El Capítulo 0 presentó las bases de datos relacionales y las cuatro familias NoSQL. Esta sección va más allá: en qué es realmente buena cada familia, las categorías más recientes (series temporales, búsqueda, vectoriales y SQL distribuido), cómo elegir a partir de pruebas y no del entusiasmo, y cuánto cuesta operar varios tipos a la vez. La respuesta rara vez es una sola base de datos para todo, y casi nunca una base de datos distinta para cada servicio.
Los modelos de datos de un vistazo
Relacional: sigue siendo la opción por defecto, por buenas razones
Una base de datos relacional almacena los datos en tablas con tipos, claves y restricciones declarados, y responde a consultas SQL declarativas, una idea del artículo de Edgar Codd de 1970. Cincuenta años después sigue siendo la opción por defecto sensata para los datos de negocio, por cuatro razones. Primera, las transacciones y las restricciones: la propia base de datos garantiza que un pago y sus asientos en el libro mayor se confirman juntos y que ningún pedido apunta a un cliente inexistente, así que estas reglas no tienen que reimplementarse, de forma imperfecta, en cada servicio. Segunda, la flexibilidad de las consultas: no necesitas conocer todas las preguntas futuras cuando diseñas el esquema; un nuevo informe es una nueva consulta, no una nueva tabla. Tercera, la madurez: décadas de herramientas para copias de seguridad, replicación, monitorización, migración y diagnóstico de rendimiento, e ingenieros que ya la conocen. Cuarta, la amplitud: los sistemas relacionales modernos almacenan e indexan JSON (el jsonb de PostgreSQL) y admiten búsqueda de texto completo, datos geoespaciales (PostGIS), particionado por tiempo y similitud vectorial (la extensión pgvector), así que una sola base de datos bien gestionada puede cubrir muchas necesidades a escala moderada.
Los límites reales son concretos. Las escrituras en un único primario están limitadas por una sola máquina; las tablas muy grandes necesitan un particionamiento cuidadoso; los cambios de esquema en tablas enormes requieren técnica (evolución de esquemas); y algunos patrones de acceso, como los recorridos profundos de grafos o la búsqueda de texto ordenada por relevancia, los resuelven mucho mejor motores especializados. Un solo servidor moderno con unidades de estado sólido rápidas puede atender miles de transacciones por segundo y terabytes de datos, lo que cubre las necesidades de la mayoría de las organizaciones.
Las familias no relacionales
Una base de datos documental almacena cada registro como un documento autocontenido, normalmente JSON o una forma binaria de JSON. Encaja con los agregados en el sentido del diseño guiado por el dominio: cosas que se leen y se escriben como un todo, como la carta de un restaurante con sus secciones, platos y grupos de opciones. Leer un documento es una sola búsqueda, sin joins. El compromiso aparece cuando hay que consultar los mismos datos con otra forma (todos los platos que contienen maní (cacahuete) en todas las cartas) o cambiarlos en muchos documentos a la vez; los productos modernos tienen joins y transacciones entre varios documentos, pero son más costosos y menos naturales que en SQL.
Un almacén clave-valor es un diccionario distribuido: guardas un valor bajo una clave y lo recuperas. Como el almacén nunca mira dentro de los valores, puede ser extremadamente rápido y fácil de particionar. Redis y su bifurcación de código abierto Valkey mantienen los datos en memoria con persistencia opcional y añaden estructuras de datos (conjuntos ordenados, flujos, índices geoespaciales) y caducidad; Amazon DynamoDB es un almacén gestionado y particionado clave-valor y documental. Encajan para sesiones, carritos, contadores de limitación de tasa, feature flags, cachés y la última posición de cada repartidor.
Un almacén de columnas anchas (Bigtable, Apache Cassandra, ScyllaDB, HBase) agrupa las filas por una clave de partición y las almacena ordenadas por una clave de agrupación (clustering key) dentro de cada partición. Está diseñado para volúmenes masivos de escritura repartidos entre muchos nodos y centros de datos. La disciplina que exige es el modelado a partir de las consultas: diseñas una tabla por consulta, duplicando datos libremente, porque las consultas que no parten de la clave de partición son caras o imposibles. Cassandra desciende en parte del artículo de Amazon sobre Dynamo, de 2007, cuyas ideas de replicación aparecen en dos secciones más adelante.
Una base de datos de grafos almacena los nodos y las relaciones como registros de primera clase y responde a consultas de recorrido como clientes a tres saltos o menos de esta red de fraude
sin los joins en cascada que hacen lentas esas consultas en SQL. Cypher, de Neo4j, es el lenguaje de consulta más conocido, e ISO publicó en 2024 un lenguaje estándar de consulta de grafos, GQL (ISO/IEC 39075). Los grafos son excelentes para la detección de fraude, las recomendaciones y el análisis de redes, y suelen ser un mal almacén principal para los datos transaccionales de negocio.
Almacenes de series temporales, de búsqueda y vectoriales
Una base de datos de series temporales está optimizada para mediciones con marca de tiempo que llegan en orden y rara vez se actualizan: métricas, lecturas de sensores, precios, historial de ubicaciones. Comprime mucho, particiona por tiempo, reduce la resolución de los datos antiguos (conservar cada punto durante una semana y promedios por minuto durante un año) y elimina a bajo costo los datos caducados descartando particiones de tiempo enteras. Algunos ejemplos son InfluxDB, Prometheus (para la monitorización) y TimescaleDB, que es una extensión de PostgreSQL y muestra con qué frecuencia una base de datos relacional puede estirarse para encajar.
Un motor de búsqueda como Elasticsearch, OpenSearch o Apache Solr (todos construidos sobre la biblioteca Apache Lucene) mantiene un índice invertido de las palabras a los documentos que las contienen, con análisis de texto (lematización, sinónimos, tolerancia a erratas) y ordenación por relevancia. Responde a ramen vegano cerca de mí
en milisegundos. Casi nunca debe ser un sistema de registro: los índices se actualizan casi en tiempo real en lugar de forma transaccional, y el diseño habitual alimenta el motor de búsqueda desde la base de datos propietaria y reconstruye el índice a partir de ella cuando hace falta.
Una base de datos vectorial almacena embeddings, listas de números que representan el significado de textos, imágenes o productos, y encuentra los elementos más cercanos a un vector de consulta. La búsqueda exacta compara la consulta con cada vector, así que estos almacenes usan índices de búsqueda aproximada de vecinos más cercanos, como los grafos HNSW, que sacrifican un poco de exhaustividad (recall) a cambio de velocidad. Impulsan la búsqueda semántica, las recomendaciones y la recuperación para modelos de lenguaje grandes, que se tratan en generación aumentada por recuperación. Existen productos dedicados (Milvus, Qdrant, Pinecone, Weaviate), pero para millones de vectores, y no miles de millones, suele bastar con una extensión de una base de datos existente, como pgvector.
SQL distribuido
Las bases de datos de SQL distribuido, a veces llamadas NewSQL (un término acuñado por el analista Matthew Aslett en 2011), mantienen el modelo relacional, SQL y las transacciones ACID, pero particionan y replican los datos automáticamente entre muchos nodos, a menudo entre regiones. Google Spanner, descrito en un artículo de OSDI de 2012, usa relojes estrechamente sincronizados (su API TrueTime, respaldada por GPS y relojes atómicos) para ofrecer transacciones globalmente consistentes. CockroachDB, YugabyteDB y TiDB ofrecen modelos similares sobre hardware corriente; CockroachDB usa por defecto el aislamiento serializable.
El precio lo ponen la física y la operación. Una transacción que deben acordar réplicas en varias regiones espera un viaje de ida y vuelta de consenso, así que las escrituras de una sola fila tardan de milisegundos a decenas o cientos de milisegundos, en lugar de muy por debajo de un milisegundo. La planificación de consultas entre particiones es más sutil, los costos son más altos y menos ingenieros conocen sus modos de fallo. El SQL distribuido es la herramienta adecuada cuando de verdad necesitas transacciones relacionales más allá de la capacidad de un servidor o entre regiones (un libro mayor de pagos global, un banco multirregión), y una herramienta cara cuando bastaría con un único primario PostgreSQL con réplicas.
Comparación de las familias de bases de datos
| Familia | Modelo de datos y consultas | Ventajas | Puntos débiles | Ejemplos |
|---|---|---|---|---|
| Relacional | Tablas, claves, SQL con joins y agregaciones | Transacciones y restricciones, consultas ad hoc flexibles, herramientas maduras, ampliamente conocida | Límite del escalado vertical para las escrituras en un nodo; el esquema rígido necesita migraciones | PostgreSQL, MySQL, SQL Server, Oracle |
| Documento | Documentos de tipo JSON, consultas sobre campos y valores anidados | Encaje natural para agregados que se leen como un todo; estructura flexible | Joins y transacciones entre documentos más débiles o costosos; esquema aplicado en el código | MongoDB, Couchbase, Firestore |
| Clave-valor | Valor opaco por clave; get, put, delete | Muy rápido, sencillo, fácil de particionar | Sin consultas entre valores; la carga del modelado recae en la aplicación | Redis, Valkey, DynamoDB, etcd |
| Col. anchas | Filas agrupadas por clave de partición, ordenadas por clave de agrupación | Rendimiento de escritura enorme, escalado horizontal lineal, varios centros de datos | Tablas construidas por consulta; joins y consultas ad hoc limitados | Apache Cassandra, ScyllaDB, HBase, Bigtable |
| Grafo | Nodos y aristas con propiedades; consultas de recorrido | Consultas de relaciones de varios saltos | Más difícil de particionar; ecosistema más pequeño | Neo4j, Amazon Neptune |
| Series temp. | Puntos con marca de tiempo, etiquetas; consultas por rango y de agregación | Compresión, conservación, reducción de resolución | Malo para actualizaciones generales y relaciones | InfluxDB, TimescaleDB, Prometheus |
| Motor de búsqueda | Índice invertido sobre documentos; consultas de texto ordenadas por relevancia | Búsqueda de texto completo, coincidencia aproximada, facetas | No es un sistema de registro; actualización casi en tiempo real | Elasticsearch, OpenSearch, Apache Solr |
| Vectorial | Embeddings; búsqueda aproximada de vecinos más cercanos | Similitud semántica para recuperación y recomendaciones | Resultados aproximados; costo de construir el índice; herramientas jóvenes | pgvector, Milvus, Qdrant, Pinecone |
| SQL distribuido | Modelo relacional, SQL, particionado y replicado | Transacciones y SQL con escalado horizontal y supervivencia multirregión | Mayor latencia de escritura, costo y complejidad operativa | Google Spanner, CockroachDB, YugabyteDB, TiDB |
Elegir: los criterios que importan
Elige por conjunto de datos, no por sistema. Para cada conjunto de datos importante, reúne pruebas sobre seis criterios y deja constancia de la decisión en un ADR.
Forma de los datos. ¿Son tabulares por naturaleza, con muchas relaciones, un agregado autocontenido, una red, una serie temporal, texto libre o vectores? Patrones de acceso. ¿Qué consultas se ejecutan, con qué frecuencia, con qué objetivos de latencia y cuántas son ad hoc? ¿Predominan las lecturas o las escrituras? ¿Siempre por clave o por muchos atributos? Necesidades de consistencia. ¿Necesitan los datos transacciones de varios elementos y restricciones (saldos, existencias, reservas), o unos segundos de desactualización son inofensivos (me gusta, recomendaciones)? Consulta los modelos de consistencia. Escala. Tamaño de los datos, escrituras por segundo y crecimiento, actuales y previstos, medidos y no adivinados; un almacén que escala a petabytes no es ninguna ventaja para 50 gigabytes. Operación. ¿Quién lo va a operar: copias de seguridad, actualizaciones, failover, monitorización, parches de seguridad? ¿Hay un servicio gestionado en tu nube y cuánto cuesta con tus volúmenes? Conocimientos del equipo. ¿Qué conoce ya el equipo lo bastante bien como para depurarlo a las 3 de la madrugada? Una tecnología desconocida trae modos de fallo desconocidos.
Dos hábitos mejoran la elección. Anota las cinco o diez consultas más importantes con sus latencias objetivo antes de elegir, y prueba el candidato con volúmenes de datos realistas; muchas decepciones vienen de un almacén que se evaluó en un portátil con mil filas. Y separa el sistema de registro de los almacenes derivados: el sistema de registro necesita las garantías más sólidas y la tecnología más conservadora, mientras que los almacenes derivados (índices de búsqueda, cachés, modelos de lectura) pueden ser especializados precisamente porque pueden reconstruirse.
Guía de decisión
Guía de decisión: ¿qué tipo de almacén para estos datos?
Hazte estas preguntas para cada conjunto de datos (no una sola vez para todo el sistema), en este orden. Detente en el primer sí que encaje; si llegas al final, se mantiene la opción relacional por defecto.
- ¿Son estos datos un sistema de registro que necesita transacciones de varias filas, restricciones o consultas ad hoc (pedidos, pagos, cuentas, reservas)?SíUsa una base de datos relacional. Busca más allá solo si puedes demostrar que no puede cumplir un requisito de escala o de latencia medido.NoContinúa: los datos pueden ser derivados, especializados o de un volumen extremadamente alto.
- ¿Es una copia derivada de un sistema de registro para atender una consulta especial (búsqueda de texto completo, recomendaciones, búsqueda por similitud)?SíUsa el almacén especializado para esa consulta (motor de búsqueda, índice de grafos o vectorial), alimentado desde el sistema de registro y reconstruible a partir de él.NoContinúa.
- ¿Se lee y se escribe como un único elemento por clave, sin consultas entre elementos (sesiones, carritos, últimas posiciones, feature flags)?SíEncaja un almacén clave-valor, a menudo en memoria y con caducidad. Decide qué ocurre si se pierde.NoContinúa.
- ¿Es un flujo, casi solo de adición, de mediciones con marca de tiempo que se consultan por rango de tiempo (métricas, lecturas de sensores, historial de ubicaciones)?SíUna base de datos de series temporales o, con volúmenes moderados, tablas particionadas por tiempo en una base de datos relacional.NoContinúa.
- ¿Superarán el volumen de escritura o el tamaño de los datos lo que puede manejar un servidor bien ajustado, con acceso siempre por una clave conocida?SíUn almacén de columnas anchas o clave-valor diseñado para el particionamiento (Cassandra, DynamoDB), con tablas diseñadas en torno a las consultas.NoContinúa.
- ¿Necesitas transacciones relacionales y SQL entre regiones o más allá de la capacidad de un servidor?SíConsidera el SQL distribuido (Spanner, CockroachDB, YugabyteDB), aceptando una mayor latencia de escritura y un mayor costo de operación.NoQuédate con la opción relacional por defecto y revísala cuando cambie un requisito medido.
La persistencia políglota y su costo
La persistencia políglota consiste en usar distintas tecnologías de almacenamiento para distintos datos dentro de un mismo sistema, elegidas según cómo se usan los datos. Martin Fowler popularizó el término en 2011, y atribuyó su primer uso a Scott Leberknight. Se deriva de forma natural de la base de datos por servicio: cada propietario puede elegir la herramienta adecuada.
El costo es fácil de subestimar. Cada tipo adicional de base de datos necesita sus propios conocimientos especializados, procedimientos de copia de seguridad y restauración, monitorización, planificación de capacidad, refuerzo de la seguridad, ciclo de actualizaciones y conocimientos para las guardias. Ahora los datos se mueven entre almacenes, así que necesitas pipelines (CDC, eventos) y debes razonar sobre el retardo y los fallos de cada uno. La consistencia entre almacenes es, como mucho, eventual. Para un equipo pequeño, cinco bases de datos pueden consumir más esfuerzo que el producto. Una regla razonable es justificar cada nuevo almacén con un requisito que los existentes demostrablemente no pueden cumplir, y preferir servicios gestionados para los especializados.
Ejemplo práctico
Ejemplo práctico: los almacenes de la plataforma de reparto de comida
La plataforma opera en 40 ciudades. En el pico de la noche recibe unos 300 pedidos por minuto, tiene 20 000 repartidores conectados, sirve 50 000 cartas de restaurantes y recibe unas 2000 búsquedas por segundo. El equipo de 35 ingenieros ya opera bien PostgreSQL.
| Pedidos y pagos | Sistema de registro; transacciones de varias filas (pedido, líneas, autorización del pago); reglas estrictas; consultas ad hoc del equipo de soporte. Unos 5 pedidos nuevos por segundo en el pico (unas pocas decenas de escrituras de filas). PostgreSQL, con una réplica para el failover. No hay motivos para nada más. |
|---|---|
| Cartas | Predominan las lecturas, jerárquicas (secciones, platos, grupos de opciones), editadas por los restaurantes unos pocos miles de veces al día. Los precios deben ser exactamente los que registra el pedido. PostgreSQL con un núcleo relacional (restaurante, plato, precio) y jsonb para las opciones variables. Un almacén documental encajaría con la forma, pero añadiría una segunda tecnología sin cumplir ningún requisito que PostgreSQL no cumpla. |
| Ubicaciones de los repartidores | 20 000 repartidores que envían cada uno una posición cada 4 segundos suponen 5000 escrituras por segundo, de las que para el despacho solo importa la última de cada repartidor, y solo durante unos 30 segundos. Almacén clave-valor en memoria (Redis o Valkey) con consultas geoespaciales y una caducidad de 30 segundos. Perderlo en un reinicio cuesta un ciclo de actualización. Una muestra de puntos (por ejemplo, uno cada 30 segundos) va al almacén de datos para la analítica. |
| Búsqueda de restaurantes y platos | Texto completo, tolerante a erratas, filtrado por ubicación, horario de apertura y etiquetas dietéticas, ordenado por relevancia. Motor de búsqueda (OpenSearch), alimentado desde la base de datos de cartas mediante captura de datos de cambios y reconstruible a partir de ella. Acepta unos segundos de retardo tras una edición de la carta. |
| Analítica | Ingresos semanales, tiempos de entrega por ciudad, utilización de los repartidores: grandes recorridos y agregaciones sobre meses de historial. Almacén de datos en la nube alimentado por CDC y eventos, con horas de antigüedad por diseño. Consulta analítica y streaming. |
| Descartados | Una base de datos de grafos para las recomendaciones (todavía no hace falta; se revisará con pruebas), una base de datos de series temporales separada para las ubicaciones (la muestra del almacén de datos responde a las preguntas que se plantean) y el SQL distribuido (los pedidos de toda la plataforma, unos 5 por segundo en el pico, caben holgadamente en un solo primario; no hay ningún requisito de transacciones multirregión). |
El resultado son dos sistemas de registro sobre una tecnología bien conocida más tres almacenes derivados especializados. Cada tecnología adicional se justifica con un requisito que la opción por defecto no puede cumplir: 5000 escrituras efímeras por segundo y la búsqueda de texto ordenada por relevancia.
Anotar primero las consultas y las cifras hizo que las decisiones fueran casi obvias, y dio al equipo un registro de los supuestos que revisar cuando cambien los volúmenes.
El panorama de almacenes resultante
Errores comunes
Elecciones para engordar el currículum: elegir un almacén porque es nuevo o porque lo usa una gran empresa, sin el requisito que lo justificaba allí. Elegir para una escala imaginaria: diseñar para mil millones de usuarios con un producto que tiene mil, pagando el impuesto de la complejidad desde el primer día. Usar un almacén derivado como sistema de registro: un índice de búsqueda o una caché que se convierte en la única copia de los datos, con una durabilidad más débil de lo que nadie suponía. Ignorar el lado de las consultas: elegir un almacén clave-valor o de columnas anchas y descubrir después que el negocio necesita informes ad hoc y filtros que no puede atender. Subestimar la operación: olvidar que alguien tiene que restaurarlo desde una copia de seguridad, actualizarlo sin tiempo de inactividad y diagnosticarlo bajo carga. Por último, tratar la elección como una verdad permanente: deja constancia de los supuestos (volúmenes, consultas, conocimientos del equipo) para poder revisar la decisión cuando cambien.
Comprueba lo que has entendido
¿Por qué un motor de búsqueda no debe ser, por lo general, el sistema de registro?
Su índice se actualiza casi en tiempo real en lugar de forma transaccional y sus garantías de durabilidad son más débiles; debe alimentarse desde la base de datos propietaria y reconstruirse a partir de ella cuando haga falta.
Da dos señales de que un almacén de columnas anchas puede ser una buena opción.
Un volumen de escritura muy alto, más allá de un servidor, y un acceso que siempre parte de una clave de partición conocida, de modo que las tablas pueden diseñarse por consulta.
¿Qué representa un 'token de innovación' en el ensayo de McKinley?
Una de las pocas oportunidades que tiene una empresa de adoptar una tecnología desconocida, cada una de las cuales trae modos de fallo desconocidos y un costo operativo duradero.
¿Cuándo compensa el costo del SQL distribuido?
Cuando necesitas transacciones relacionales y SQL más allá de la capacidad de un servidor o entre regiones, como en un libro mayor global; no cuando un único primario con réplicas cumple los requisitos.
Fuentes y lecturas recomendadas
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “Nuestro equipo quiere usar MongoDB para un nuevo servicio de pedidos porque es más flexible. ¿Cómo decido si es buena idea en comparación con PostgreSQL?”