2009-08-28 73 views

回答

15

我通常將它們存儲爲文件去,並存儲在數據庫中的路徑。對我來說,將它們作爲blob推入數據庫是一種更容易,更自然的方法。

將它們存儲在數據庫中的一個參數:更容易完成全備份,但這取決於您的需求。如果您需要能夠輕鬆獲取數據庫的完整快照(包括圖像),那麼將它們作爲Blob存儲在數據庫中可能是一條可行的路。否則,您必須將數據庫備份與文件備份配對,並以某種方式嘗試關聯這兩者,以便如果必須執行還原,則需知道要還原哪對。

+3

如果你有一個網絡應用程序,文件是要走的路,你用數據庫中的路徑信息構建HTML,指向存儲在客戶端瀏覽器將從其下拉的文件。 – 2009-08-28 15:05:23

+0

我正在構建一個離線應用程序。我發現存儲blob可以輕鬆複製數據庫。只是一個想法! – 2013-06-24 18:04:42

+0

我寫了一個小型運輸系統並將圖像粘貼到數據庫中。一旦達到大規模,數據庫備份變得非常有問題(30,000張圖像)。 最終數據庫和任何查詢返回圖像停止。數據庫引擎SQL服務器存在嚴重問題,必須清除查詢緩存才能解決問題。最後我最終將它重構了出來。 添加一些磁盤管理是值得的,我從不再將圖像粘貼到SQL Server數據庫。 – Skarsnik 2015-03-18 06:26:53

2

如果我在一臺Web服務器上運行,並且只能運行在一臺Web服務器上,我將它們存儲爲文件。如果我在多個網站頭上運行,則將圖像的參考實例放入數據庫BLOB,並將其作爲文件緩存在網站頭上。

10

這取決於圖像的大小。

微軟研究院有關於這個問題的interesting document

+11

該文檔的總結是文件系統(NTFS)在文件大於1MB時性能更好,數據庫對文件小於1MB(越小越好)的性能會更好。 – sjdirect 2014-01-17 18:18:08

+0

這篇論文是從2006年開始的,那是11年前的事了。所以今天的事情可能會不同。實際上,結論是:「(...)如果對象平均大於1 MiB,則NTFS比SQL Server有明顯的優勢。如果對象數量低於256 KiB,則數據庫具有明顯優勢。在這個範圍內,這取決於...「 – 2017-10-17 04:36:44

1

斑點可在DB /腳本,爲什麼不直接存儲路徑重。我們曾經使用blob的唯一原因是它需要合併複製或者資產的超級安全性(因爲除非登錄或者其他東西,否則無法拉出圖像)

+0

對你來說,我需要」超級安全「。所以我認爲像安全文件一樣的納稅申報一個blob會是最好的,沒有?然後所有非安全項目,如圖像等。 ,可能在文件夾中? – user982853 2017-05-24 18:02:36

2

鑑於您可能想要保存圖像以及名稱,簡要說明,創建日期,創建等等,您可能會發現保存在數據庫中會更好。那樣,一切都在一起。如果您保存了相同的信息並將圖像存儲爲文件,則必須從兩個地方檢索整個「圖像對象」......然後在路上,您可能會發現自己正在同步問題(某些圖像未找到) 。希望這是有道理的。

2

通過保存你的意思是使用它們來顯示在網頁或類似的東西? 如果是這樣的話,最好的選擇是使用文件,如果你使用的是數據庫,它將不斷受到照片請求的打擊。而且這種情況並不能很好地擴展。

+0

沒有圖像,這些只是交易相關的文件,所以每次有人像訪問徽標或其他東西一樣訪問該網站時都不會拉動這些文件,這些文件都是客戶端文檔,當專業人士或客戶端試圖查看它們時 – user982853 2017-05-24 17:59:40

9

我試圖使用數據庫(SQL Server和MySQL)來存儲介質(< 5mb)文件,我得到的是很多麻煩。

1)某些數據庫(SQL Server Express)具有大小限制;

2)一些數據庫(MySQL)變得極其緩慢; 3)當你必須顯示一個對象列表時,如果你不小心做了SELECT * FROM表,大量的數據會試圖從數據庫上下移動,導致致命的慢響應或內存失敗;

4)一些前端(ruby ActiveRecord)處理blob有很大的麻煩。

只需使用文件。不要將它們全部存儲在同一個目錄中,使用一些技術將它們放在多個dirs上(例如,可以使用GUID的後兩個字符或int id的後兩個數字),然後將路徑存儲在db中。

+0

您在'SELECT * FROM table'上賣了我 - 我定期使用它來進行測試,單靠這個可能會導致我頭痛。 – rybo111 2014-02-07 10:56:13

2

問題是,您的應用程序是否處理BLOBS或其他應用程序數據文件?您的用戶是否將圖像與其他數據一起上傳?如果是這樣,那麼你應該將BLOB存儲在數據庫中。它使備份數據庫變得更容易,並在出現問題時恢復到事務一致狀態。

但如果你的意思是它們的應用infratstructure的一部分,而不是用戶數據,那麼可能的答案是圖像,第

3

數據庫服務器的性能命中是一個頗具爭議的問題。如果您需要文件系統的性能優勢,只需在第一個請求上將其緩存即可。隨後的請求可以通過直接鏈接直接從文件系統提供(如果是Web應用程序,則可以在刷新輸出緩衝區之前重寫HTML)。

這提供了兩全其美:

  • 權威店是 數據庫,同時保持交易和 參照完整性
  • 您可以部署通過 所有用戶數據簡單地部署數據庫
  • 清空緩存(例如,通過添加一個 網絡服務器)只會導致 臨時性能下降,而自動重新填充 。

沒有必要不斷地捶了數據庫的事物,不會改變所有的時間,但重要的是,用戶數據都在那裏,而不是分散在不同的地方,使得多服務器操作並部署一個混亂。 我一直主張「數據庫作爲用戶數據存儲,除非」方法,因爲它在體系結構上更好,而且不一定比使用有效緩存更慢。儘管如此,使用文件系統作爲權威商店的一個很好的理由是當你真的需要使用外部獨立工具來訪問它時,例如, SFTP和什麼。