O que é o feed?
O feed (ou timeline) de um usuário é a lista de publicações de todas as pessoas que ele segue, normalmente ordenadas da mais recente para a mais antiga. Ele não inclui (na sua versão simples) suas próprias publicações nem as de quem você não segue.
Para construí-lo você precisa de dois passos:
- Descobrir quem o usuário segue (percorrer as arestas do grafo).
- Ficar com as publicações cujo
autor_idesteja nesse conjunto, e ordená-las pordatadecrescente.
Em SQL isso é um JOIN entre publicacoes e seguidores.
O problema N+1
Imagine que você já tem as publicações do feed e, para cada uma, quer mostrar o nome do seu autor. Uma solução ingênua é:
for (const post of publicacoes) {
post.autor = await carregarUsuario(post.autor_id); // uma consulta por post!
}
Se o feed tiver 100 publicações, isso são 1 consulta para o feed + 100 consultas para os autores = 101 consultas. Isso é o problema N+1: uma consulta inicial e depois N consultas adicionais, uma para cada linha. Com muitas linhas e a latência de rede, a página fica lentíssima.
A solução: carregar em lote
Em vez de pedir os autores um a um, você reúne todos os autor_id que
precisa e os pede de uma só vez:
const ids = [...new Set(publicacoes.map((p) => p.autor_id))];
const autores = await carregarMuitos(ids); // 1 única consulta
Depois você constrói um índice (um Map ou um objeto) de id → autor para
buscar cada autor em tempo constante. Você passa de N+1 consultas para 2. Essa
técnica é a base de padrões como DataLoader e do batching no GraphQL.