Almacenamiento de imágenes en DB: ¿sí o no?
Entonces estoy usando una aplicación que almacena imágenes en gran medida en la base de datos. ¿Cuál es su perspectiva sobre esto? Soy más del tipo que almacena la ubicación en el sistema de archivos que almacenarla directamente en la base de datos.
¿Cuáles crees que son los pros y los contras?
Estoy a cargo de algunas aplicaciones que gestionan muchos TB de imágenes. Hemos descubierto que lo mejor es almacenar las rutas de los archivos en la base de datos.
Hay un par de problemas:
- El almacenamiento de bases de datos suele ser más caro que el almacenamiento del sistema de archivos.
- Puede acelerar el acceso al sistema de archivos con productos estándar disponibles en el mercado.
- por ejemplo, muchos servidores web utilizan la llamada al sistema sendfile() del sistema operativo para enviar de forma asincrónica un archivo directamente desde el sistema de archivos a la interfaz de red. Las imágenes almacenadas en una base de datos no se benefician de esta optimización.
- Cosas como servidores web, etc., no necesitan codificación o procesamiento especial para acceder a las imágenes en el sistema de archivos.
- Las bases de datos ganan cuando la integridad transaccional entre la imagen y los metadatos es importante.
- Es más complejo gestionar la integridad entre los metadatos de la base de datos y los datos del sistema de archivos.
- Es difícil (dentro del contexto de una aplicación web) garantizar que los datos se hayan descargado al disco en el sistema de archivos.
Como ocurre con la mayoría de los problemas, no es tan simple como parece. Hay casos en los que tendría sentido almacenar las imágenes en la base de datos.
- ¿Está almacenando imágenes que cambian dinámicamente, por ejemplo facturas, y desea obtener una factura tal como estaba el 1 de enero de 2007?
- El gobierno quiere que mantengas 6 años de historia
- Las imágenes almacenadas en la base de datos no requieren una estrategia de copia de seguridad diferente. Las imágenes almacenadas en el sistema de archivos no
- Es más fácil controlar el acceso a las imágenes si están en una base de datos. Los administradores inactivos pueden acceder a cualquier carpeta del disco. Se necesita un administrador realmente decidido para husmear en una base de datos para extraer las imágenes.
Por otro lado, existen problemas asociados
- Requerir código adicional para extraer y transmitir las imágenes
- La latencia puede ser más lenta que el acceso directo a archivos
- Mayor carga en el servidor de la base de datos.
Almacén de archivos. Los ingenieros de Facebook tuvieron una gran charla al respecto. Una conclusión fue conocer el límite práctico de archivos en un directorio.
Aguja en un pajar: almacenamiento eficiente de miles de millones de fotografías
Esto puede ser una posibilidad un poco remota, pero si está usando (o planea usar) SQL Server 2008, le recomiendo que eche un vistazo al nuevo tipo de datos FileStream .
FileStream resuelve la mayoría de los problemas relacionados con el almacenamiento de archivos en la base de datos:
- En realidad, los Blobs se almacenan como archivos en una carpeta.
- Se puede acceder a los Blobs mediante una conexión de base de datos o a través del sistema de archivos.
- Las copias de seguridad están integradas.
- La migración "simplemente funciona".
Sin embargo, el "Cifrado de datos transparente" de SQL no cifra los objetos FileStream, por lo que si eso es una consideración, es mejor que los almacene como varbinary.
Del artículo de MSDN:
Las declaraciones Transact-SQL pueden insertar, actualizar, consultar, buscar y realizar copias de seguridad de datos de FILESTREAM. Las interfaces del sistema de archivos Win32 brindan acceso de transmisión a los datos.
FILESTREAM utiliza el caché del sistema NT para almacenar en caché los datos de los archivos. Esto ayuda a reducir cualquier efecto que los datos de FILESTREAM puedan tener en el rendimiento del motor de base de datos. El grupo de búfer de SQL Server no se utiliza; por lo tanto, esta memoria está disponible para el procesamiento de consultas.
Las rutas de archivos en la base de datos son definitivamente el camino a seguir: he escuchado historia tras historia de clientes con TB de imágenes de que se convirtió en una pesadilla intentar almacenar una cantidad significativa de imágenes en una base de datos; el impacto en el rendimiento por sí solo es demasiado.