He hecho 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 esto una mala idea?
¿Afectará al rendimiento de mi sitio cuando crezca?
La alternativa sería almacenar la imagen en el disco y sólo almacenar la referencia a la imagen en la base de datos. Este debe ser un dilema común que mucha gente ha tenido. Agradecería algún consejo y, de hecho, estaría encantado de cometer un error menor si pudiera.
Hay un documento muy bueno de Microsoft Research llamado To Blob or Not To Blob.
Su conclusión, tras un gran número de pruebas y análisis de rendimiento, es la siguiente:
si tus imágenes o documentos suelen tener un tamaño inferior a 256KB, almacenarlos en una columna VARBINARY de la base de datos es más eficiente
si sus imágenes o documentos suelen tener un tamaño superior a 1 MB, es más eficiente almacenarlos en el sistema de archivos (y con el atributo FILESTREAM de SQL Server 2008, siguen estando bajo control transaccional y forman parte de la base de datos)
entre estos dos, es un poco de un sorteo dependiendo de su uso
Si usted decide poner sus fotos en una tabla de SQL Server, yo recomendaría encarecidamente el uso de una tabla separada para almacenar esas fotos - no almacenar la foto del empleado en la tabla de empleados - mantenerlos en una tabla separada. De esta manera, la tabla de empleados puede seguir siendo eficiente, asumiendo que no siempre necesita seleccionar la foto del empleado, también, como parte de sus consultas.
En cuanto a los grupos de archivos, consulte Arquitectura de archivos y grupos de archivos para obtener una introducción. Básicamente, usted crearía su base de datos con un filegroup separado para estructuras de datos grandes desde el principio, o añadiría un filegroup adicional más tarde. Llamémoslo "LARGE_DATA".
Ahora, cada vez que tenga que crear una nueva tabla 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
Consulta la introducción de MSDN sobre los grupos de archivos y juega con ellos.
Una vez caí en este dilema, e investigué bastante en google en busca de opiniones. Lo que encontré fue que efectivamente muchos ven mejor guardar las 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
https://stackoverflow.com/questions/4659441/mysql-blob-vs-file-for-storing-small-png-images
Mi veredicto final fue que para cosas como una foto de perfil, sólo una pequeña imagen cuadrada que necesita estar allí por usuario, mySQL sería mejor que almacenar un montón de pulgares en el hdd, mientras que para los álbumes de fotos y cosas por el estilo, carpetas / archivos de imagen son mejores.
Espero que sea de ayuda
Yo preferiría almacenar la imagen en un directorio, y luego almacenar una referencia al archivo de imagen en la base de datos.
Sin embargo, si almacena la imagen en la base de datos, debería dividir 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.