DevPath · Aprenda a programar ESPTEN

Projeto: rede social

O feed e o problema N+1

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:

  1. Descobrir quem o usuário segue (percorrer as arestas do grafo).
  2. Ficar com as publicações cujo autor_id esteja nesse conjunto, e ordená-las por data decrescente.

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.

Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
← O plano: usuários, seguidores e o grafo socialVer o módulo →