2011-12-20 62 views
6

我們正在設計一個.NET應用程序,用於存儲和搜索大量圖像(> 100.000)。使用filestream來存儲圖像和縮略圖是個不錯的主意嗎?

當我們上傳圖片時,我們需要創建一個縮略圖並將原始圖片和縮略圖存儲在數據庫(SQL Server 2008 R2)中。

我讀過,存儲圖像的最佳方法是使用FILESTREAM

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

但是當圖像較小,這是ineficient。

使用filestream存儲圖像和縮略圖是一個好主意嗎?有更好的選擇嗎?

回答

9

微軟研究院的一篇名爲To Blob or Not To Blob的論文深入討論了這個話題。

他們大量的性能測試和分析後得出的結論是這樣的:

  • 如果您的圖片或文檔通常低於在大小256K,將它們存儲在數據庫中VARBINARY列更有效

  • 如果您的圖片或文檔的大小通常超過1 MB,將它們存儲在文件系統中效率更高(並且對於SQL Server 2008的屬性,它們仍處於事務控制下並且是數據庫的一部分)

  • 在這兩個之間

    ,這取決於你的使用有點難以取捨的

如果你決定把你的照片到SQL Server表,我會強烈建議使用一個單獨的表存儲這些圖片 - 不要將員工照片存儲在員工表中 - 將他們保存在單獨的表格中。這樣一來,假設您並不總是需要選擇員工照片作爲查詢的一部分,那麼員工表可以保持精簡併且意味着非常高效。

對於文件組,請查看Files and Filegroup Architecture的介紹。基本上,您可以從一開始就爲大數據結構創建一個單獨的文件組的數據庫,或者稍後添加一個額外的文件組。我們稱之爲「LARGE_DATA」。

現在,只要你有一個新的表來創建一個需要存儲VARCHAR(MAX)VARBINARY(MAX)列,可以爲大型數據指定該文件組:

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 

檢查出文件組的MSDN介紹,和玩它!

+0

嗯,事實是,在所有查詢中,我們需要選擇縮略圖或照片(縮略圖用於結果搜索,以及用於輸入照片以查看圖像數據)。在那種情況下,我們也必須在兩行中分開保存? – 2011-12-20 11:25:19

2

其實正確的答案 - 這取決於。 如果圖像相對較小 - 可以將其保留在varbinary(max)字段中。

爲什麼不使用FILESTREAM? - FILESTREAM的性能在大BLOB值上達到最佳狀態 - 1Mb +

相關問題