Trabajo en un gran sistema de software que ha realizado ambos mecanismos para almacenar archivos adjuntos y otro contenido. La primera iteración del sistema almacenó todos los datos en BLOB en la base de datos. Lo maldije en ese momento. Como programador, podía escribir scripts secundarios para operar inmediatamente en los datos y cambiarlos cuando quisiera.
Avance unos 10 años y sigo manejando el mismo software pero la arquitectura ha cambiado y fue escrito con punteros del sistema de archivos. Lo maldigo ahora y desearía que estuviera de vuelta en la base de datos. Tengo el beneficio adicional de varios años y de haber trabajado esta aplicación en una capacidad mucho mayor en muchas más y muchas situaciones más grandes, siento que mi opinión ahora es mejor educada. La promoción o la migración del sistema de la aplicación requiere una secuencia de comandos extensa y la copia de millones de archivos. En una ocasión, cambiamos el sistema operativo y todos los punteros de archivo tenían el separador de directorio incorrecto, o el nombre del servidor cambia donde estaba el archivo y tuvimos que escribir y programar declaraciones de actualización de SQL simples con el DBA durante el fin de semana para solucionarlo. Otra es que los registros del sistema de archivos y de la base de datos no están sincronizados, el motivo es incierto, pero después de miles de días de funcionamiento, a veces los sistemas no transaccionales (el sistema de archivos y la base de datos no comparten contextos transaccionales) simplemente pierden la sincronización. A veces, los archivos desaparecen misteriosamente.
Cuando todo esto estaba en la BD, la migración o promoción del entorno era cuestión de volcar e importar la BD. Los cambios de fila se pueden auditar correctamente, todo está sincronizado y los registros se pueden reproducir en un punto en el tiempo si es necesario. Seguro que la base de datos crece, pero estamos en 2011 y esto simplemente no es un desafío para las bases de datos.
Por lo que vale, tuvimos algunos problemas similares con grandes búferes de datos cuando transmitimos algunos datos, pero A) podíamos bombear los datos en búferes de bytes con Input|OutputStreams en JDBC y B) cuando usamos otras herramientas, escribimos un procedimiento almacenado eso dividiría el BLOB en una tabla temporal y serviría iterativamente los fragmentos de la tabla temporal. Funciona muy bien.
No me importa cuál sea la razón técnica para no poner estas cosas en la base de datos, pero es mucho más fácil para administrar en una ubicación consolidada, podría duplicar y triplicar el hardware o agrupar la base de datos por el tiempo que pierden los consultores y los clientes solo en un corto período de tiempo administrando los archivos dispares.
Actualización:tenga cuidado con los comentaristas, solo están dando su opinión sobre el asunto.