Digamos que eu tenha duas tabelas: users
e tweets
. Quero exibir um perfil de usuário completo e os tweets mais recentes por ID.
É melhor buscá-los em duas chamadas separadas, possivelmente simultâneas/paralelas? em JS seria:
const result = await Promise.all(
query(`SELECT * FROM users WHERE id = 1`),
query(`SELECT * FROM tweets WHERE user_id = 1`)
);
const profile = result[0];
const tweets = result[1];
OU
faça uma consulta, junte-se simplesmente e recupere os dados do usuário, digamos, do primeiro elemento da matriz? por exemplo
// pseudo code
const tweets = await query(`
SELECT * FROM users
JOIN tweets
ON users.id = tweets.id
WHERE users.id = 1`)
if (tweets.length > 0) {
const { username, avatar } = tweets[0]; // reading any column to get user data
}
A segunda consulta está apenas desperdiçando largura de banda porque os dados do usuário são copiados em todas as colunas?
De alguma forma, percebi que é uma má prática fazer várias chamadas sql e, mesmo em um cenário tão simples, não sei se estou complicando demais as coisas.
Se você planejou unir os dados fora do banco de dados de qualquer maneira, normalmente é mais eficiente deixar o banco de dados fazer a junção, pois os bancos de dados são bastante bons para determinar a melhor maneira de processar manipulações de dados.
Por outro lado, se você planejou manter os dados separados no aplicativo, poderá ser mais rápido (da perspectiva do aplicativo) executar duas consultas em paralelo. Especialmente se você projetou a UI do aplicativo para exibir os dados de forma assíncrona, de forma que parte da página comece a carregar enquanto aguarda o restante dos dados.
Sua
users
tabela provavelmente não possui muitos e grandes campos de tipo de dados; portanto, a largura de banda provavelmente é insignificante nesse cenário específico.Parece que seus dados serão mantidos separados uns dos outros na página
User Profile
/Tweets
, então o último design pode ser um pouco melhor, especialmente para umUser
com muitos arquivosTweets
. Mas se você começar a implementar outras páginas e funcionalidades onde você precisa juntar os dados (como uma exportação CSV que repete as informaçõesUser
com cadaTweet
linha), então pode fazer sentido do ponto de vista do desempenho ou mesmo apenas de uma perspectiva de código simplificado para faça a junção na camada do banco de dados.