2011-12-20 15 views
6

Estamos diseñando una aplicación .NET, que almacena y busca una gran cantidad de imágenes (> 100.000).¿Es una buena idea usar filestream para almacenar imágenes y miniaturas?

Cuando cargamos una imagen, tenemos que crear una miniatura y almacenar la imagen original y la miniatura en el DB (SQL Server 2008 R2).

He leído que la mejor manera de almacenar las imágenes está usando FILESTREAM

http://msdn.microsoft.com/en-us/library/cc949109.aspx

pero cuando las imágenes son más pequeñas que esto es ineficient.

¿Es una buena idea almacenar imágenes y miniaturas con filestream? Hay una mejor alternativa?

Respuesta

9

Hay un documento muy bueno de Microsoft Research llamado To Blob or Not To Blob que trata este tema en profundidad.

Su conclusión después de un gran número de pruebas y análisis de rendimiento es la siguiente:

  • si sus imágenes o documentos están típicamente por debajo de 256 K en tamaño, almacenándolos en una base de datos VARBINARY columna es más eficiente

  • si sus imágenes o documentos tienen más de 1 MB de tamaño, 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)

  • entre los dos, es un poco de una cara o cruz en función de su uso

Si usted decide poner sus imágenes en una tabla de SQL Server, recomendaría encarecidamente el uso de una tabla separada para almacenar esas imágenes, no almacenar la foto del empleado en la tabla de empleados, mantenerlas en una tabla separada. De esta forma, la tabla de Empleados puede mantenerse baja, moderada y muy eficiente, asumiendo que no siempre es necesario seleccionar la foto del empleado, también, como parte de sus consultas.

Para los grupos de archivos, echa un vistazo a Files and Filegroup Architecture para una introducción. Básicamente, crearía su base de datos con un grupo de archivos separado para estructuras de datos grandes desde el principio, o agregaría un grupo de archivos adicional más adelante. Llamémoslo "LARGE_DATA".

Ahora, cada vez que tenga una nueva tabla para crear lo que necesita almacenar VARCHAR(MAX) o VARBINARY(MAX) columnas, 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 MSDN en grupos de archivos, y ¡juega con eso!

+0

Bueno, la verdad es que en TODAS las consultas debemos seleccionar la miniatura O la foto (miniatura para búsquedas de resultados, y la foto al ingresar para ver los datos de la imagen)) En ese caso, ¿debemos mantenernos separados en dos filas también? –

2

En realidad es la respuesta correcta, depende. Si las imágenes son relativamente pequeñas, puede mantenerlo en el campo varbinary (max).

¿Por qué no FILESTREAM? - El rendimiento de FILESTREAM alcanza su mejor nivel en valores BLOB grandes - 1Mb +

Cuestiones relacionadas