2013-05-14 56 views
4

我知道關於將文件存儲爲blob在數據庫中是否是不好的做法存在很多爭議,但我只想了解這是否會在我的情況下是有道理的。將文件存儲在文件系統中或作爲SQL Server中的varbinary(MAX)

我正在創建一個ASP.NET應用程序,在大公司內部使用,用戶需要能夠將文件附加到系統中的「作業」。這些文件通常是PDF或Word文檔,可能永遠不會超過幾MB。

我創建一個新的表像這樣:

ID (int) 
JobID (int) 
FileDescription (nvarchar(250)) 
FileData (varbinary(MAX) 

是使用varbinary(MAX)這裏理想,或者我應該存儲到文件的路徑和簡單存儲設備中的文件系統上的某個地方?

+0

[Filestream](http://msdn.microsoft.com/en-us/library/hh461480.aspx)可能會給你兩全其美 - 它們存儲爲文件,但SQL知道它們,他們是任何交易的一部分,等等 – 2013-05-14 13:00:14

+0

你應該檢查這個問題http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – 2013-05-14 13:42:43

回答

6

微軟研究院有一篇名爲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

那篇論文「Blob or Not To Blob「涉及SQL Server 2005,而varbinary是在SQL Server 2008中引入的,因此它可能不完全相關。 – StuartN 2018-02-15 11:33:56

+1

@StuartN:'VARBINARY(MAX)** **在SQL Server 2005中是可用的 - 當然。新的'FILESTREAM'屬性在2008年被添加,是的。 – 2018-02-15 11:48:00

相關問題