¿Almacenar imágenes en SQL Server?

192

He creado un pequeño sitio de demostración y en él estoy almacenando imágenes dentro de una columna de imágenes en el servidor SQL. Algunas preguntas que tengo son ...

  • ¿Es una mala idea?

  • ¿Afectará el rendimiento en mi sitio cuando crezca?

La alternativa sería almacenar la imagen en el disco y solo almacenar la referencia a la imagen en la base de datos. Esto debe ser un dilema común que muchas personas han tenido. Agradecería algunos consejos y estaría encantado de cometer un error menor si pudiera.

marko
fuente
55
¿Hay alguna nueva incorporación para este problema en 2017? ¿Sigue siendo válido a partir de hoy?
Haikal Nashuha

Respuestas:

274

Hay un muy buen artículo de Microsoft Research llamado To Blob o Not To Blob .

Su conclusión después de una gran cantidad de pruebas de rendimiento y análisis es la siguiente:

  • Si sus imágenes o documentos suelen tener un tamaño inferior a 256 KB, es más eficiente almacenarlos en una columna VARBINARIA de la base de datos

  • Si sus imágenes o documentos suelen tener un tamaño superior a 1 MB, almacenarlos en el sistema de archivos es más eficiente (y con el atributo FILESTREAM de SQL Server 2008, todavía están bajo control transaccional y son parte de la base de datos)

  • entre esos dos, es un poco difícil dependiendo de su uso

Si decide colocar sus imágenes en una tabla de SQL Server, le recomiendo encarecidamente que use una tabla separada para almacenar esas imágenes, no almacene la foto del empleado en la tabla del empleado, guárdelas en una tabla separada. De esa manera, la tabla de empleados puede mantenerse delgada, mala y muy eficiente, suponiendo que no siempre tenga que seleccionar la foto del empleado, como parte de sus consultas.

Para grupos de archivos, consulte Archivos y arquitectura de grupos de archivos para una introducción. Básicamente, crearía su base de datos con un grupo de archivos separado para grandes estructuras de datos desde el principio, o agregaría un grupo de archivos adicional más adelante. Llamémosle "LARGE_DATA".

Ahora, siempre que tenga una nueva tabla para crear que necesite almacenar columnas VARCHAR (MAX) o VARBINARY (MAX), puede especificar este grupo de archivos para los datos grandes:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

¡Mira la introducción de MSDN en los grupos de archivos y juega con ella!

marc_s
fuente
¿Es esto algo bueno o malo .... • si sus imágenes o documentos tienen un tamaño de más de 1 MB, almacenarlos en el sistema de archivos es más eficiente (y con el atributo FILESTREAM de SQL Server 2008, todavía están bajo control transaccional y parte de la base de datos)
htm11h
Gran respuesta. Si tienes ganas de explicar en detalle por qué me recomienda utilizar una tabla dedicada para datos de imagen, he creado un elemento separado que en dba.SE .
Heinzi
16

Caí en este dilema una vez, e investigué bastante en Google para obtener opiniones. Lo que encontré fue que, de hecho, muchos ven que es mejor guardar imágenes en el disco para imágenes más grandes, mientras que mySQL permite un acceso más fácil, especialmente desde lenguajes como PHP.

Encontré una pregunta similar

MySQL BLOB vs File para almacenar pequeñas imágenes PNG?

Mi veredicto final fue que para cosas como una foto de perfil, solo una pequeña imagen cuadrada que debe estar allí por usuario, mySQL sería mejor que almacenar un montón de pulgares en el disco duro, mientras que para álbumes de fotos y cosas así, carpetas / Los archivos de imagen son mejores.

Espero eso ayude

Kevin Chavez
fuente
14

Preferiría almacenar la imagen en un directorio, luego almacenar una referencia al archivo de imagen en la base de datos.

Sin embargo, si almacena la imagen en la base de datos, debe particionar su base de datos para que la columna de la imagen resida en un archivo separado.

Puede leer más sobre el uso de grupos de archivos aquí http://msdn.microsoft.com/en-us/library/ms179316.aspx .

John Hartsock
fuente
12

Por qué puede ser bueno almacenar imágenes en la base de datos y no en un catálogo en el servidor web.

Ha realizado una aplicación con muchas imágenes almacenadas en una carpeta en el servidor, que el cliente ha utilizado durante años.

Ahora vienen a ti. El servidor ha sido destruido y necesitan restaurarlo en un nuevo servidor. Ya no tienen acceso al antiguo servidor. La única copia de seguridad que tienen es la copia de seguridad de la base de datos.

Por supuesto, tiene la fuente y puede simplemente implementarla en el nuevo servidor, instalar SqlServer y restaurar la base de datos. Pero ahora todas las fotos se han ido.

Si ha guardado las imágenes en SqlServer, todo funcionará como antes.

Solo mis 2 centavos.

Erling Ervik
fuente
3
Buen punto. Las copias de seguridad de las imágenes son tan importantes como la copia de seguridad de la base de datos ... a veces incluso más.
Chris Catignani
También las imágenes en el sistema de archivos necesitan permisos de red también.
Chris Catignani
2
Los permisos de red son un buen punto. Pero no veo un caso en el que solo tenga una copia de seguridad de la base de datos. Seguramente tendría una copia de seguridad de la aplicación y los archivos. Podría perder fácilmente la base de datos pero tener los archivos.
Norbert Norbertson
7

Si bien los problemas de rendimiento son válidos, las razones reales en la práctica por las que debe evitar almacenar imágenes en una base de datos son por razones de administración de la base de datos. Su base de datos crecerá muy rápidamente y las bases de datos cuestan mucho más que el simple almacenamiento de archivos. Las copias de seguridad y restauraciones de bases de datos son mucho más costosas y requieren más tiempo que las restauraciones de copias de seguridad de archivos. En caso de necesidad, puede restaurar una base de datos más pequeña mucho más rápido que una llena de imágenes. Compare 1 TB de almacenamiento de archivos en Azure con una base de datos de 1 TB y verá la gran diferencia en el costo.

J Miglietta
fuente
0

En mi experiencia, almacenar en la url las imágenes almacenadas en otra ubicación es la mejor manera para un proyecto simple.

Beverly Ukandu
fuente