Armazenar imagens no HD ou no Banco

SQL Server

10/06/2020

Bom dia,

Eu estou em um projeto que vai armazenar imagens, são dezenas de milhares de imagens em pdf tamanho de papel a4.
E minha dúvida é a eterna "Armazenar as imagens no banco ou do HD".
As literaturas que consegui são muito inconclusivas, todas trazem como inconveniente do armazenamento no banco o fato de que ele vai inchar, isto é meio óbvio o que eu gostaria de saber é se o banco vai perder performance, se ele vai perder então de quanto vai se esta perda, tem algum recurso para gerenciar ou mitigar esta perda, porque se eu armazenar no HD vou precisar criar no sistema uma série de rotinas para gerenciar estas imagens trabalho este que o banco faria sozinho.

Tecnicamente tem alguma literatura que recomenda não armazenar imagens no banco ou o contrario?

Como todos devem ter percebido minha preferência seria armazenar estas imagens no banco mas o que eu não posso é esperar ele estar com 20gb pra depois descobrir que peguei o ônibus errado.

Alguém pode me ajudar com estas respostas, antecipadamente muito obrigado a todos.
Amauri Alves

Amauri Alves

Curtidas 0

Melhor post

Jothaz

Jothaz

10/06/2020

Este é um assunto que desperta paixões e polarização.

Sem conhecer os pormenores de sua aplicação, expertise da equipe e infra, fica impossível definir qual a melhor estratégia.
Você e sua esquipe que devem definir o que vão adotar, pois opiniões externas são somente achismos.

Vou usar um clichê, tudo depende do cenário e do seu objetivo.

Para todo benefício tem um custo, então correndo o risco de chover no molhado seguem algumas considerações:

Vantagens de armazenar no banco de dados:

Se optar por salvar no banco de dados uma dica que eu considero importantíssima é crie uma tabela separada somente para imagens, assim você segrega os acesso o que pode melhorar muito a performance, pois só irá acessar a tabela quando realmente precisar das imagens.

1 - Diminui a complexidade da infra rotina de backup do banco de dados, não tem que incluir a pasta das imagens, pois basta backup do banco de dados.

2 - Encapsula o controle de acesso no BD, do contrário terá que fornecer as mesmas permissões e direitos na pasta, que ser forem negligenciadas pode causar transtornos.
(Conceder acesso indevido aos documentos)

3 - Segurança, pois somente usuário validado no login terá acesso as imagens.

4 - Há controle transacional ou garantia de sincronismo apagando o registro apaga-se a imagem. Assim não corre o risco de imagens órfãs.

5 - Há isolação de transação ao pagar o registro (e a imagem)… as alterações no registros só são vistas após commit, a imagem porém some na hora, evitando o controle de concorrência das imagens tem de serem feitas “na mão”.

6 - Imagens não podem ser abertas diretamente por um link no browser. (Pode ser uma vantagem ou desvantagem. Se precisar compartilhar o link da imagem é uma desvantagem.)

Desvantagens de armazenar no banco de dados:

1 - Seu banco de dados certamente ficará maior, podendo perder performance, mas isso dependerá de sua infra e um bom DBA pode contornar isso "tunando" o BD. Porém exige um elevando grau de conhecimento.
E é impossível mensurar o quanto a performance irá cair sem uma prova de conceito.

2 - Maior transação e tráfego de informações para o DB ter que tratar.

3 - Imagens não podem ser abertas diretamente por um link no browser. (Pode ser uma vantagem ou desvantagem. Se precisar compartilhar o link da imagem é uma desvantagem.)

4 - Caso haja necessidade de carregar múltiplas imagens, pode afetar a performance ainda mais e complicar a codificação.


Vantagens de armazenar em pasta:

1 - Ao salvar o caminho no banco você reduz a quantidade de dados armazenados e transfere os arquivos diretamente para o sistema operacional, ou seja, uma pasta também vai crescer, mas não vai afetar o desempenho do banco.

2 - Seu banco de dados fica menor. O banco de dados cresce somente com informações, pois com as imagens o crescimento pode ser maior que previsto.

3 - Imagens podem ser abertas diretamente por um link compartilhado no browser. (Pode ser uma vantagem ou desvantagem.)

4 - Facilidade de apresentar múltiplas imagens.

5 - Não há isolação de transação. Pode ser uma vantagem pois é possível alterar o caminho no banco de dados ou a própria imagem de forma simples e direta (copy e sql).


Desvantagens de armazenar em pasta:

1 - De certa forma aumenta a complexidade do seu código, pois irá lidar com mais situações de erro (permissão de arquivo, imagens órfãs, arquivos apontados que não existem, muitos arquivos na mesma pasta podem causar lentidão)

2 - Aumenta a complexidade da infra, pois além de backup de banco de dados tem a pasta das imagens.

3 - Não há isolação de transação e sincronismo. Pode ser um desvantagem, pois podem gerar registro no banco de dados orfãs como imagens na pasta órfãs. Precisando se preocupar e ter um tratamento para estes casos.

4 - Imagens podem ser abertas diretamente por um link compartilhado no browser. (Pode ser uma vantagem ou desvantagem.)


Talvez minha resposta não tenha ajudado, mas não existe uma receita de bolo, "para cada escolha uma renuncia".

Tenta criar uma prova de conceito com as duas opções, pode parecer perda de tempo, mas ao escolher o caminho certo você evita transtornos.

O sábio Friedrich Nietzsche dizia:

"Ninguém pode construir em teu lugar as pontes que precisarás passar, para atravessar o rio da vida - ninguém, exceto tu, só tu.
Existem, por certo, atalhos sem números, e pontes, e semideuses que se oferecerão para levar-te além do rio; mas isso te custaria a tua própria pessoa; tu te hipotecarias e te perderias."









GOSTEI 1
POSTAR