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
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?
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.
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.