Eu trabalho em um grande sistema de software que fez os dois mecanismos para armazenar anexos e outros conteúdos. A primeira iteração do sistema armazenou todos os dados em BLOBs no banco de dados. Eu amaldiçoei na época. Como programador, eu poderia escrever scripts paralelos para operar imediatamente nos dados e alterá-los sempre que quisesse.
Avanço cerca de 10 anos e ainda gerencio o mesmo software, mas a arquitetura mudou e foi escrito com ponteiros de sistema de arquivos. Eu amaldiçoo agora e gostaria que estivesse de volta no banco de dados. Eu tenho o benefício adicional de vários anos e tendo trabalhado esta aplicação com muito mais capacidade em muitas outras e muitas situações maiores, sinto que minha opinião agora é mais bem educada. A promoção ou migração do sistema do aplicativo requer scripts extensivos e cópia de milhões de arquivos. Em uma ocasião, mudamos o sistema operacional e todos os ponteiros de arquivo tinham o separador de diretório errado, ou o nome do servidor muda onde o arquivo estava e tivemos que escrever e agendar instruções simples de atualização SQL com o DBA no fim de semana para corrigir. Outra é que os registros do sistema de arquivos e do banco de dados ficam fora de sincronia, por que é incerto, mas após milhares de dias de operação, às vezes sistemas não transacionais (sistema de arquivos e banco de dados não compartilham contextos transacionais) simplesmente ficam fora de sincronia. Às vezes, os arquivos desaparecem misteriosamente.
Quando tudo isso estava no BD, migração ou promoção de ambiente era questão de despejar e importar o BD. As alterações de linha podem ser auditadas adequadamente, tudo em sincronia e os logs podem ser reproduzidos em um momento específico, se necessário. Claro que o banco de dados fica grande, mas estamos em 2011 e essas coisas simplesmente não são um desafio para bancos de dados.
Por que vale a pena, tivemos alguns problemas semelhantes com grandes buffers de dados ao transmitir alguns dados, mas A) poderíamos bombear os dados em buffers de byte com o Input|OutputStreams em JDBC e B) ao usar outras ferramentas, escrevemos um procedimento armazenado que dividiria o BLOB em uma tabela temporária e serviria iterativamente os pedaços da tabela temporária. Funciona bem.
Não me importa qual seja o motivo técnico para não colocar essas coisas no banco de dados, mas é muito mais fácil para gerenciar em um local consolidado eu poderia dobrar e triplicar o hardware ou grade do banco de dados pelo tempo perdido por consultores e clientes em um curto período de tempo gerenciando os arquivos díspares.
Atualização:pegue leve com os comentaristas, eles estão apenas dando sua opinião sobre o assunto.