“Ana”
Nombre de una persona.
Bases de datos y almacenamiento, desde cero. Usaremos una app de reseñas de videojuegos como ejemplo.
Un dato es un valor que la app usa o necesita recordar.
“Ana”
Nombre de una persona.
5
Calificación de un juego.
avatar.png
Imagen de perfil.
El contexto da sentido al dato: Ana calificó un juego con 5 estrellas.
Escribir “Ana” en una pantalla no garantiza que siga ahí mañana.
La app muestra el dato.
La pantalla desaparece.
La app busca el dato guardado.
El dato vuelve a aparecer.
Si debe sobrevivir al cierre, necesita almacenamiento persistente.
Mientras está abierta
Ejemplo: texto que aún no envías. Puede perderse al cerrar.
En ese navegador o teléfono
Ejemplo: preferencia de tema oscuro.
Disponible para tu cuenta
Ejemplo: reseñas que ves al iniciar sesión en otro teléfono.
Antes de elegir una herramienta, pregunta: ¿quién debe poder recuperar el dato?
Es un sistema para guardar datos de forma organizada y encontrarlos cuando la app los necesita.
Cada contacto tiene nombre y teléfono.
Puedes añadir un contacto, buscarlo, cambiarlo o borrarlo.
Cada reseña tiene autor, juego y calificación.
La app puede guardar la reseña y mostrarla más tarde.
La base de datos ayuda a conservar, organizar y consultar información.
Se parece a una hoja de cálculo: columnas para tipos de datos y filas para registros.
| ID | Nombre | Correo |
|---|---|---|
| 1 | Ana | ana@ejemplo.com |
| 2 | Luis | luis@ejemplo.com |
Una fila representa a un usuario. Su ID permite distinguirlo de los demás.
Ana publica una reseña.
La app enseña la reseña.
Ana corrige su texto.
Ana quita su reseña.
Estas cuatro acciones suelen llamarse CRUD. Primero entiende la acción; después aprende el nombre.
La API es la puerta por la que la app pide leer o guardar datos.
Para archivos grandes usamos almacenamiento de archivos u objetos. Amazon S3 es un ejemplo de ese servicio.
Guarda la imagen
avatares/ana.pngEl archivo se puede recuperar con su ubicación.
Guarda la referencia
Usuario: Ana
Imagen: avatares/ana.png
Así la app sabe a quién pertenece.
S3 conserva el archivo; la base conserva los datos sobre ese archivo.
Si muchas personas piden la misma lista de juegos, la app puede guardar una copia temporal.
Cada petición consulta la base.
La base entrega la lista actual.
La lista puede salir de una copia rápida.
Cuando cambia, hay que renovar esa copia.
La base guarda el dato principal. La caché acelera algunas lecturas cuando hace falta.
No tienes que usar todas estas piezas el primer día.
Filas y columnas
Usuarios en una tabla; juegos en otra; reseñas en otra.
Datos agrupados
Un juego puede guardar título, plataforma y etiquetas dentro de un documento.
Ambas formas guardan datos. La elección depende de cómo se usan y se relacionan.
“Relacional” significa que podemos relacionar registros de distintas tablas.
Con esos números, la app puede saber quién escribió la reseña y de qué juego habla.
SQL es un lenguaje para guardar, consultar y cambiar datos. Aquí solo leeremos una instrucción.
SELECT titulo FROM juegos;
“Muéstrame el título de cada juego.”
SELECT dice qué dato queremos.
FROM dice de qué tabla sale.
SQL es el idioma de la consulta; la base es el lugar donde están los datos.
Una base no relacional no usa tablas conectadas como su forma principal de organizar datos. “NoSQL” es un nombre común para esta familia.
{
"titulo": "Luz de ceniza",
"plataforma": "web",
"etiquetas": ["rol", "cooperativo"]
}
Un juego y sus datos juntos.
También existen bases de clave y valor: das una clave, como “juego-8”, y recuperas su valor.
NoSQL no significa datos desordenados. Al final verás ejemplos de clave y valor, columnas amplias y grafos.
Útil si conectas personas, productos, pedidos o reseñas.
Las tablas ayudan a representar esas relaciones con claridad.
Útil si el dato principal se lee como un documento.
Puede servir para fichas con campos que varían entre registros.
Para empezar: escribe qué datos tienes y qué preguntas debe responder tu app.
“Una reseña la crea Ana y la leen otros usuarios.”
Va de la app a la API y luego a la base de datos. Al abrir el juego, la app la pide de nuevo.
Si pueden explicar ese recorrido, ya tienen el punto de partida de su proyecto.
Las tres entienden SQL. Su historia y el lugar donde viven los datos son distintos.
Historia. Nació como el proyecto POSTGRES en Berkeley en 1986. Tomó el nombre PostgreSQL en 1996.
Ventaja. Puede exigir, por ejemplo, que cada reseña pertenezca a un usuario existente; también admite extensiones.
Úsalo para. Cuentas, reseñas, pedidos o reservas que se conectan entre sí.
Historia. Su primera versión apareció en 1995 y se volvió muy usado en aplicaciones web.
Ventaja. Muchos proveedores, bibliotecas y tutoriales para aplicaciones web.
Úsalo para. Un blog, una tienda o un catálogo con usuarios y tablas relacionadas.
Historia. El proyecto comenzó en 2000 para ofrecer una base pequeña y autónoma.
Ventaja. Guarda la base en un archivo y no necesita un servidor aparte.
Úsalo para. Datos locales de una app móvil o de escritorio y prototipos.
MongoDB es una base documental. Un registro puede guardar listas y datos anidados dentro del mismo documento.
La empresa nació como 10gen en 2007. La primera versión de MongoDB salió en 2009 para trabajar con datos flexibles a gran escala.
Ventaja. Una ficha puede reunir campos que cambian entre productos o juegos.
Úsalo para. Un catálogo donde cada tipo de artículo tiene características distintas.
Una ficha de juego
{
"titulo": "Luz de ceniza",
"plataformas": ["PC", "móvil"],
"modo": "cooperativo"
}Aun con campos flexibles, debes decidir cómo buscar y relacionar los datos.
Redis trabaja principalmente en memoria. En nuestra app puede acelerar datos que se consultan muchas veces.
Salvatore Sanfilippo empezó Redis en 2009 para resolver un problema de escala en su propia empresa.
Ventaja. Acceso rápido y estructuras útiles para contadores, sesiones y listas ordenadas.
La lista principal puede quedar temporalmente en Redis para responder a muchas visitas.
Úsalo para. Caché, sesiones, contadores o rankings que necesitan respuesta rápida.
Redis también puede guardar datos en disco, pero para este ejemplo la base principal conserva las reseñas.
El motor es el programa que guarda y consulta datos. Un servicio administrado lo ejecuta y se ocupa de parte de su operación.
Para su proyecto: elijan primero qué dato van a guardar; después decidan qué motor y quién lo operará.
GitLab contó que PostgreSQL guardaba casi todos los datos generados por sus usuarios. Al crecer, dividió esa gran base en dos.
Su aplicación necesita recuperar datos conectados: personas, proyectos y el trabajo que sucede en ellos.
Cuando la escala cambió, separó la base principal de la base de integración continua.
“Muéstrame las tareas de este proyecto y quién las abrió.”
Imagina tablas de usuarios, proyectos y tareas. Un ID conecta cada tarea con su proyecto y su autor.
Eso permite consultar relaciones y aplicar reglas, como impedir que una tarea apunte a un proyecto inexistente.
En su app: usuarios, juegos y reseñas tienen el mismo tipo de relación.
Firefox guarda historial y marcadores en un archivo llamado places.sqlite dentro del perfil de la persona.
Firefox puede buscar un marcador o mostrar visitas anteriores consultando esa base local.
SQLite usa SQL y funciona sin levantar un servidor de base de datos separado.
Partida guardada en el dispositivo
partida.db → nivel, progreso, ajustesAl cerrar y abrir, el juego lee el archivo. Para verlo en otro dispositivo haría falta sincronizarlo aparte.
SQLite sirve cuando el dato debe sobrevivir localmente y una base de servidor no hace falta.
SEGA HARDlight publicó que ejecutó Sonic Forces: Speed Battle con MongoDB Atlas para soportar funciones en línea y muchos jugadores.
El estudio buscaba flexibilidad para datos de juego asociados a cada cuenta y capacidad para los picos de actividad tras un lanzamiento.
MongoDB guarda documentos que pueden agrupar campos y listas relacionados.
Un perfil de jugador
{
"jugador": "ana",
"personajes": ["sonic", "tails"],
"nivel": 12
}Este documento ilustra el modelo; no es un esquema interno publicado por SEGA.
Un documento es útil cuando esos datos se consultan juntos como una unidad.
Niantic usa Redis como caché para compartir datos de juego entre servidores cuando muchas personas se preparan para una incursión.
Muchos jugadores llegan al mismo lugar a la vez. Sus servidores necesitan responder con rapidez mientras se forma el grupo.
El estudio de caso reporta menos latencia en esa preparación al compartir datos mediante Redis.
Clave → dato que se pide seguido
incursion:123 → estado temporalRedis permite recuperar rápido una copia. Cuando cambia el estado, esa copia debe actualizarse o vencer.
La clave mostrada es un ejemplo de clase, no una clave interna de Niantic.
Redis brilla cuando la misma información se consulta muchas veces y la rapidez importa.
Discord publicó cómo pasó de MongoDB a Cassandra y luego a ScyllaDB para guardar mensajes a una escala enorme.
ScyllaDB agrupa mensajes por canal y por una ventana de tiempo. Así puede buscar el historial de un canal sin recorrer todos los mensajes.
Este modelo se conoce como columnas amplias. Usa tablas, pero las organiza según las consultas previstas.
“Dame los mensajes recientes del canal 42.”
canal + periodo → mensajes ordenadosSe diseña primero la pregunta frecuente y luego la forma de agrupar los datos. Es una herramienta especializada para mucho volumen.
La lección para su app: elige el modelo pensando en cómo leerás los datos.
AWS documentó que Activision Blizzard usó Amazon Neptune para representar recorridos y estados de jugadores de Call of Duty y personalizar experiencias.
Un grafo guarda elementos y enlaces entre ellos. Sirve cuando la pregunta consiste en seguir varias conexiones.
La fuente habla de la franquicia Call of Duty; no atribuye esta arquitectura específicamente a Warzone.
Jugador → partida → escuadrón → evento
Podríamos preguntar qué experiencias conectan a varios jugadores o qué eventos ocurrieron después de una partida.
Este dibujo explica el tipo de pregunta; no representa el esquema interno de Warzone.
Un grafo ayuda cuando lo importante es recorrer relaciones, no solo guardar una ficha.
Guarda un dato real de tu app.
Cierra la app, vuelve a abrirla y comprueba que puedes recuperarlo.
“Guardé ___ en ___ porque ___.”
Si es una imagen, explica dónde vive el archivo y dónde queda su referencia.
Dos textos pueden decir lo mismo con palabras distintas. Para reconocerlo, un modelo de embeddings convierte cada texto en una lista de números.
“Olvidé mi clave”
Un manual podría decir “Restablecer la contraseña”. Las palabras cambian, pero la idea es parecida.
[0.12, −0.37, 0.84, …]
Los números representan rasgos del texto. Un índice vectorial busca los fragmentos cuyos vectores están más cerca del vector de la pregunta.
Se conserva el texto original, su identificador y su vector para poder recuperar el fragmento correcto.
“Dame el usuario con ID 42.”
La base encuentra una fila concreta. Es lo que quieres para cuentas, pagos, inventario o permisos.
ID 42 → Ana“¿Cómo recupero mi acceso?”
La búsqueda vectorial devuelve textos cercanos en significado, aunque ninguno use exactamente esas palabras.
pregunta → fragmentos parecidosPuedes combinar ambas: comprobar primero qué documentos puede leer Ana y después buscar entre ellos los más parecidos.
Pinecone: búsqueda semántica ↗ · pgvector: consultas y filtros ↗
Este patrón se llama RAG: recuperar información relevante y dársela al modelo antes de que responda.
Divides el manual en fragmentos pequeños.
Creas un embedding para cada fragmento y lo guardas con su texto.
Conviertes la pregunta en vector y recuperas los fragmentos más cercanos.
El modelo recibe la pregunta y esos fragmentos para redactar la respuesta.
Ejemplo: “Olvidé mi clave” recupera el apartado “Restablecer contraseña”. El modelo lo usa en esa respuesta; no hace falta volver a entrenarlo.
Los dos permiten buscar vectores cercanos. La diferencia práctica es dónde viven y cómo los operas.
Es una base vectorial administrada. Creas un índice y consultas los fragmentos más similares; también puedes filtrar por metadatos como curso o idioma.
Úsalo si quieres un servicio dedicado a la búsqueda vectorial sin administrar ese índice dentro de tu PostgreSQL.
Añade columnas de vectores y búsqueda por distancia a PostgreSQL. Puedes guardar usuarios, documentos y embeddings en la misma base y consultarlos con SQL.
Úsalo si tu app ya usa PostgreSQL y quieres empezar a buscar por similitud allí.
Dato útil: con pgvector puedes filtrar por curso_id en SQL y ordenar esos resultados por similitud.
El harness es el programa que conecta al modelo con herramientas, archivos y sesiones. Guarda el historial y prepara la información que el modelo recibe en cada turno.
Conserva hilos con turnos y eventos para poder reanudarlos. Cuando la conversación crece demasiado, compacta el contexto que enviará al modelo.
Guarda transcripciones de sesión para reanudarlas. También puede cargar instrucciones de CLAUDE.md y notas de memoria del proyecto al empezar una conversación.
Detalle clave: el historial guardado puede ser mucho mayor que el contexto que cabe en el modelo. La búsqueda vectorial puede traer documentos externos relevantes; no es obligatoria para guardar una conversación.