¿Almacenar las imágenes en disco o en base de datos?

Posted by victor on February 21st, 2013
php-logoEl título es una pregunta típica al diseñar/implementar proyectos en los que interviene un número considerado de imágenes, como servicios de hospedaje de fotos. La pregunta no tiene una respuesta taxativa porque depende de la naturaleza del proyecto y de lo que se quiera realizar con esas fotos. Si necesitamos retocar las fotos, almacenarlas en base de datos puede que no sea la opción más cómoda. En este post simplemente comentaré los pros y contras de ambas opciones y que cada uno elija la que mejor se adapte. El tamaño importa y almacenar imágenes en base de datos  hace que las tablas crezcan de tamaño rápidamente por lo que podríamos alcanzar algún tipo de límite configurado en el sistema operativo. Si almacenamos las imágenes en disco tenemos el problema de las búsquedas lentas. Para evitarlo podríamos aprovechar la jerarquía de directorios para organizar las imágenes y ganaríamos tiempo de búsqueda. Reiser FS es un sistema de ficheros Linux que da muy buenos resultados en las búsquedas.   Las imágenes almacenadas en disco se pueden obtener directamente por el servidor web; Requiere de una operación de lectura en disco y de una operación de escritura en el flujo de respuesta hacia el cliente. Almacenarlas en base de datos es una opción más lenta que necesita de un script que recupere la imagen y se la entregue al servidor web. Ello supone una operación de lectura en la base de datos y una escritura para entregársela al script. Después, el script debe realizar una lectura de la imagen para enviarla a el cliente, lo que se traduce en una nueva operación de escritura, ahora sobre el flujo de respuesta. Dependiendo del tipo de aplicación que estemos desarrollado, puede que en el caso anterior no haya opción y tengamos que almacenarla en base de datos. Hablo de situaciones como en las que necesitamos controlar qué usuarios y cuantas veces acceden a una imagen, documento etc...   Almacenar las imágenes en base de datos significa tener un repositorio de imágenes centralizado para todos las servidores o instancias. A no ser que tengas algún tipo de partición remota montada en todos los servidores, almacenar imágenes en disco es algo local al servidor y puede ser una situación no deseable cuando se dispone de múltiples servidores.   Las imágenes se almacenan en MySql, por ejemplo, en un campo tipo Blob de tamaño variable. Las búsquedas con el motor MyISAM en campos variables son más ineficiente que con campos de tamaño fijo. Almacenar las imágenes en base de datos supone un grado de acoplamiento alto entre las imágenes y el gestor de base de datos. Esto no ocurre con el almacenamiento en disco. Por otro lado, almacenar las imágenes en base de datos tienen la ventaja de tener el respaldo de las transacciones (en MySQL usar motor InnoDB) por lo que si para tu aplicación son importantes ciertos atributos asociados a la imagen, la imagen y los atributos se pueden almacenar en una operación atómica. Si se produce algún fallo, no se almacena la imagen. En disco, esto no sucede. Si se produce un error, la imagen quedará corrupta y los atributos no estarán sincronizados correctamente. Almacenar las imágenes en base de datos te da el beneficio de poder usar las herramientas de backups típicas de un gestor de base de datos. Almacenarlas en disco... también tiene sus herramientas de backup pero las de base de datos te pueden permitir una recuperación parcial.

Comments

comments powered by Disqus