2011-12-20 5 views
6

Stiamo progettando un'applicazione .NET, che memorizza e ricerca una grande quantità di immagini (> 100.000).È una buona idea usare il filestream per memorizzare immagini e miniature?

Quando si carica un'immagine, è necessario creare una miniatura e memorizzare l'immagine originale e la miniatura nel DB (SQL Server 2008 R2).

Ho letto che il modo migliore per memorizzare le immagini sta usando FILESTREAM

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

ma quando le immagini sono più piccoli questo è ineficient.

È una buona idea memorizzare immagini e miniature utilizzando il filestream? C'è un'alternativa migliore?

risposta

9

C'è un ottimo documento di Microsoft Research chiamato To Blob or Not To Blob che tratta questo argomento in modo approfondito.

La loro conclusione dopo un gran numero di test di performance e analisi è questa:

  • se le tue immagini o documenti sono in genere al di sotto di 256 K in termini di dimensioni, la loro memorizzazione in un database VARBINARY colonna è più efficiente

  • se le immagini oi documenti sono in genere di dimensioni superiori a 1 MB, la loro memorizzazione nel filesystem è più efficiente (e con l'attributo FILESTREAM di SQL Server 2008, sono ancora sotto controllo transazionale e parte del database)

  • tra quei due, è un po 'di un lancio-up a seconda del vostro uso

Se si decide di mettere le immagini in una tabella SQL Server, consiglio vivamente usando una tabella separata per archiviando queste immagini - non conservare le foto dei dipendenti nella tabella dei dipendenti - tenerle in una tabella separata. In questo modo, il tavolo Employee può rimanere snello, meschino e molto efficiente, assumendo che non sia sempre necessario selezionare anche la foto del dipendente come parte delle tue domande.

Per i filegroup, consultare Files and Filegroup Architecture per un'introduzione. Fondamentalmente, dovresti creare il tuo database con un filegroup separato per grandi strutture di dati fin dall'inizio o aggiungere un filegroup aggiuntivo in seguito. Chiamiamolo "LARGE_DATA".

Ora, ogni volta che avete una nuova tabella per creare, che ha bisogno di memorizzare VARCHAR(MAX) o VARBINARY(MAX) colonne, è possibile specificare il gruppo di file per la grande dati:

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 

Partenza l'intro MSDN su filegroup, e giocarci!

+0

Bene, la verità è che in TUTTE le query è necessario selezionare la miniatura OPPURE la foto (miniatura per le ricerche dei risultati e foto quando si entra per visualizzare i dati dell'immagine). In tal caso, dobbiamo mantenere separati anche in due righe? –

2

In realtà la risposta corretta - dipende. Se le immagini sono relativamente piccole, è possibile mantenerle nel campo varbinary (max).

Perché non FILESTREAM? - Le prestazioni di FILESTREAM raggiungono il massimo su valori BLOB di grandi dimensioni - 1Mb +