DevPath · Aprende a programar ESPTEN

Proyecto: red social

El feed y el problema N+1

¿Qué es el feed?

El feed (o timeline) de un usuario es la lista de publicaciones de todas las personas a las que sigue, normalmente ordenadas de la más reciente a la más antigua. No incluye (en su versión simple) tus propias publicaciones ni las de quien no sigues.

Para construirlo necesitas dos pasos:

  1. Averiguar a quién sigue el usuario (recorrer las aristas del grafo).
  2. Quedarte con las publicaciones cuyo autor_id esté en ese conjunto, y ordenarlas por fecha descendente.

En SQL eso es un JOIN entre publicaciones y seguidores.

El problema N+1

Imagina que ya tienes las publicaciones del feed y, para cada una, quieres mostrar el nombre de su autor. Una solución ingenua es:

for (const post of publicaciones) {
  post.autor = await cargarUsuario(post.autor_id); // ¡una consulta por post!
}

Si el feed tiene 100 publicaciones, eso son 1 consulta para el feed + 100 consultas para los autores = 101 consultas. Esto es el problema N+1: una consulta inicial y luego N consultas adicionales, una por cada fila. Con muchas filas y la latencia de red, la página se vuelve lentísima.

La solución: cargar en lote

En lugar de pedir los autores uno a uno, recoges todos los autor_id que necesitas y los pides de una sola vez:

const ids = [...new Set(publicaciones.map((p) => p.autor_id))];
const autores = await cargarMuchos(ids); // 1 sola consulta

Después construyes un índice (un Map o un objeto) de id → autor para buscar cada autor en tiempo constante. Pasas de N+1 consultas a 2. Esta técnica es la base de patrones como DataLoader y del batching en GraphQL.

Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
← El plan: usuarios, seguidores y el grafo socialVer el módulo →