Alternativa caso você esteja iniciando um projeto 100% free

( a estratégia do banco de dados fiat uno )

Essa realidade de tanto dev usando seu banco para guardar arquivos pode ser por causa que as alternativas são serviços e não guias, softwares e outros tipos de ferramentas gratuitos.

Imagina começar um projeto, montando seu React, Node, MySQL e... Onde guardar os arquivos do usuário?

Agora sim vou te dar uma alternativa:

Não pense muito nisso

( você pode mudar mais tarde )

Simples, ao invés de fazer uma tabela perfil_sem_arquivo que segura a url da foto em uma string fotourl, você pode criar uma tabela foto_arquivo que vai segurar o arquivo exatamente como na tabela ERRADA inicial, a diferença é que (desde que você não dê join na tabela foto_arquivo) a velocidade será a mesma se seu arquivo estiver no banco de dados porém fora da sua tabela. (imagens mais a baixo)

Para recuperar a imagem, você pode construir uma rota apenas para a tabela do arquivo, buscando e retornando a imagem de uma vez, separadamente.

Essa estratégia é o equivalente de usar um fiat uno de frete. Geralmente você quer um frete potente, com bastante espaço por ser grande, segurança se possivel e uma equipe para te ajudar.

Porém, como você está começando agora, você só precisa levar uma mochila com roupas e seu PC Gamer até a kitnet no bairro ao lado da casa da sua mãe (sua antiga casa). É por isso que não é muito errado você guardar dados pesados no seu BD, afinal, o nome é banco de dados e não banco de penas. Acontece que hoje em dia, existem serviços tão melhores (e baratos) em distribuir arquivos estáticos que não compensa tentar subir uma startup fazendo isso manualmente.

A estratégia da Rota separada

fiatuno

Quando chegar no momento de contratar um serviço CDN para guardar suas imagens ou arquivos e você for segurar seus arquivos, você vai estar com seu banco já formatado para esse padrão. Será um trabalho de remover a rota (e o controller) antigo de buscar no seu próprio banco, remover a tabela de arquivos (pós transferência) e populando o campo fotourl já existente no seu projeto!

Até quando posso deixar os arquivos dentro do meu banco desta maneira separada?

fordmaverickgt

Até você cansar da performance ruim, mas antes, a performance ruim precisa começar a ser um problema e para isso acontecer, provavelmente sua aplicação já passou da fase de testes e se tornou um MVP ou já está sendo e você está com o investimento necessário para contratar um serviço sério.

um ponto importante é que nos testes do post, mesmo consultas que não envolviam o arquivo, tiverem um desempenho inferior em relação a tabela sem o arquivo.

Não entendi oq vc disse, se você consulta uma tabela com arquivo vai ser inferior mesmo, por isso que eu mostrei como separar o arquivo da tabela, pra solucionar **este** problema

Antigamente, projetei meu banco para armazenar apenas algumas colunas e não um arquivo em si, mas um JSON grande na última coluna de uma tabela, a mais usada/gravada/consultada. Hoje eu estou tendo que reprojetar o banco e usar cache porque o desempenho está sofrível. Não adianta, se for mal projetado, uma hora vai ter de ser refeito.

Realmente, minha solução é apenas para *começar* um projeto até poder solucionar o problema antes de se tornar um.