¿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:
- Averiguar a quién sigue el usuario (recorrer las aristas del grafo).
- Quedarte con las publicaciones cuyo
autor_idesté en ese conjunto, y ordenarlas porfechadescendente.
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.