2010-04-28 156 views
5

我使用ASP.NET MVC + NHibernate + Postres堆棧編寫Web應用程序。我想知道上傳的圖像應該作爲二進制blob存儲在數據庫中還是存儲在文件系統中(僅在db中引用)。 我能想到的db存儲的一個優點是可以輕鬆備份/恢復所有數據,而無需恢復到文件系統複製工具。另一方面,我懷疑文件系統訪問可能會更快(但是,特別是在處理多個併發請求時)? 您有什麼建議?ASP.NET MVC圖像上傳存儲位置(db vs文件系統)

+2

可能的重複http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – Cesar 2010-04-28 18:55:37

+1

在專門的CDN服務器上? – Paco 2010-04-28 19:45:39

回答

2

我會這樣做 - 確保圖像存儲在數據庫中,以便所有數據都集中在一起以便於備份,但也將數據緩存到外部,以便對大圖像的重複請求不會使緩衝區高速緩存數據庫。如果正確完成,您可以引入新的前端Web服務器,這些服務器在啓動後會透明地從數據庫中填充本地圖像緩存。

集中存儲圖像對於確保您爲具有多個Web服務器的系統中的圖像發送良好的Last-Modified和ETag HTTP響應標頭也很有用,因爲這些標頭可以從數據庫內容製作而不是採用來自本地緩存對象。

只是PostgreSQL的一個實現說明:您可以將包含圖像數據的列的「存儲模式」設置爲「外部」:這將停止PostgreSQL嘗試壓縮圖像數據(使用zlib,而不是可能會提供任何好處),並會將圖像數據存儲在輔助TOAST表中,如果您只是查詢圖像元數據,則可以提供更好的性能。見ALTER TABLE命令「SET STORAGE」的條款,例如:

ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL 
1

這取決於。你看重能夠直接鏈接到圖像,還是想要始終使用服務器端資源調用數據庫,然後爲圖像編寫二進制數據?

2

我們利用原稿存儲在數據庫進行備份,但產生的縮減是在文件系統緩存在Web服務器的圖像。

但是,如果可能,我們儘量避免任何往返數據庫,因爲它會產生巨大的負載,因爲一個頁面通常會在每個頁面視圖中調用多個圖像請求。

關於在數據庫中存儲blob的一個注意事項,我建議你將實際的blob-column存儲在一個專用的表中,並與您的實體/實體進行一一映射。這將緩解備份以及表格的更改。當表變大時,即使在備份期間,任何更改都將「永久」完成,並且鎖定是一個大問題。

如果您擁有關於圖像(二進制數據除外)的所有信息,除非您需要二進制數據(因爲它將緩存在文件系統中,您很少需要),所以選擇該數據不會受到影響。

只是我的兩分錢。

+0

不同的數據庫有不同的存儲blob的方法:postgresql會自動將大的bytea值存儲在單獨的「toast」表中,因此不需要明確地執行此操作。 – araqnid 2010-04-29 13:49:48

+0

實際上,爲了存儲圖像數據,可能建議使用「alter table ... alter column ... set storage external」來始終強制外聯存儲並禁用壓縮。 – araqnid 2010-04-29 13:57:04

+0

嗯,這很奇怪,因爲我們使用postgres,並且在更改表格和備份時遇到表鎖定問題。 – jishi 2010-04-30 13:01:30

相關問題