2013-03-12 29 views
8

我的應用程序在用戶註冊後播放視頻文件(文件大於100 MB)。文件流vs本地保存在SQL Server?

  1. 是更好地做我保存他們硬盤上,並保持文件路徑數據庫? 作爲文件流類型存儲在數據庫中嗎?

  2. 當數據存儲在數據庫中時,對操作和存儲在硬盤上更安全嗎?

  3. 如何提供數據安全防止操縱?

謝謝。

回答

10

微軟研究院有一篇名爲To Blob or Not To Blob的非常好的論文。

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

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

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

  • 在這兩個之間
  • ,這取決於你的使用有點難以取捨的

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

對於文件組,請查看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介紹,和玩它!

2

1 - 取決於你如何定義「更好」。通常,我更喜歡將二進制資產存儲在數據庫中,以便將它們與相關數據一起備份,但將它們緩存在文件系統上。將二進制數據從SQL Server流式傳輸到頁面請求是一個真正的性能問題,並沒有真正的擴展。

  1. 如果攻擊者能夠到達您的硬盤驅動器,您的整個系統都會受到危害 - 將數據存儲在數據庫中將不會提供額外的安全保護。

3 - 這本身就是一個完整的問題。對於堆棧溢出來說太寬...