Qual a melhor forma de armazenar arquivos? (Banco de dados ou em Disco mesmo?)

Estou desenvolvendo um sistema web que vai ter um módulo repositório de arquivos em .PDF e outros formatos de documento. Vou ter espaço ilimitado tanto no disco do servidor quando na base de dados porém estou estudando uma solução híbrida (uma tabela contendo os paths para os arquivos no servidor)… E aí? Seria melhor esta solução com uma tabela da descrição dos arquivos e o path ou serializar os arquivos na mesma tabela? :smiley:

Eu prefiro em disco.

Será menos transação e tráfego de informações para o DB ter que tratar. [=

Sem falar que armazenando arquivos no banco ele vai ficar pesadão

Acho que a melhor solução depende muito do seu contexto.
Alguns fatos para levar em consideração quando se armazena externamente.

  • Seu banco de dados fica menor.

  • As imagens podem ser servidas diretamente por um servidor web.

  • Não há controle transacional ou garantia de sincronismo
    Você pode apagar o registro no BD e não apagar a imagem (ou o inverso).
    Se gravar o registro e houver erro no insert, por exemplo, ficará com uma imagem órfã na pasta.

  • Não há isolação de transação
    Se alguém apaga o registro (e a imagem)… as alterações no registros só são vistas após commit, a imagem porém some na hora.
    O controle de concorrência das imagens tem de ser feita “na mão”.

  • Aumenta a complexidade da infra
    Sua rotina de backup do banco de dados, tem que incluir a pasta das imagens.
    O controle de acesso a essa pasta deve ser o mais próximo possível do controle de acesso ao bd, mesmas permissões e direitos.
    (Talvez nem todo mundo com acesso aquela pasta deveria ter acesso aos documentos)

  • Aumenta a complexidade do seu código
    Você precisa 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)

Ok, admito que puxei sardinha mais para o lado do banco de dados.
Mas acredito que colocarão mais opiniões das vantagens de armazenar externamente.

A atenção, não estou recomendando que armazene no banco de dados.
Apenas que analise se alguns dos pontos acima não seria um real problema pra você.

Esse é um assunto que também tenho bastante curiosidade, vou acompanhar a discussão.

Alguém sabe qual foi a opção adotada em grandes sites, como redes sociais (com seus albuns de fotografia) e hosts de compartilhamento de arquivos?

Já que a coisa ficou séria, vou colocar uma análise que fiz para meu TCC da pós:



Já que puxaram saco pro DB eu puxo para disco rígido! \o/

A vantagem que vejo em salvar no banco é que no dia que fizeres o backup do banco, já terá também o backup dos arquivos. Não vai precisar se preocupar com os arquivos quando trocar de máquina ou formatar o HD por algum motivo.

Pessoal preciso armazenar arquivos no Bando de Dados SQLServer2000 mas a coluna varbinary(8000) so suporta 8000 bytes , como posso aumentar isso ? preciso de uma coluna que armazene 10mb… existe maneira de fazer isso ?, Já adiantando que não posso armazenar os arquivos em disco !

Des de ja agradeço.
Thiago