2010-01-08 69 views
6

什麼是最佳方式存儲二進制文件圖片文件?存儲二進制或圖像文件的最佳方式

  1. 數據庫系統
  2. 文件系統

首先請您解釋,爲什麼呢?

+2

請爲此問題提供更多的上下文。答案可能與家庭用戶,在線商店,谷歌地圖和偏執企業環境完全不同。 – 2010-01-08 15:46:43

+1

如果有一個*正確*的方式,我懷疑會有兩種可能!這取決於你在做什麼。我的應用程序從一種方式開始,最終以另一種方式進行,因爲事情發生了變化。無論你做什麼,你都應該把它抽象出來,以至於你可以在不改變你所有代碼的情況下改變它。 – hackerhasid 2010-01-08 15:49:55

+0

@Wim Hollebrandse:對不起,你的評論意外。我在這裏發佈問題以獲得解決方案,而不是獲得排名。我需要解決方案,當我擁有它時,我感到高興。感謝stackoverflow.com爲他們的這種服務。 – 2010-01-08 16:10:30

回答

9

沒有真正的最佳方式,只是一堆折衷。

數據庫專業人員
1.在羣集環境中更容易處理。
2.不依賴文件服務器等附加資源。
3.無需在負載均衡環境中設置「同步」操作。
4.備份自動包含文件。

數據庫缺點
1.數據庫的大小/增長。
2.根據數據庫服務器和您的語言,可能很難放入和檢索。
3.速度/性能。
4.根據數據庫服務器,您必須在上傳和導出時病毒掃描文件。


文件優點
1.單網/單數據庫服務器安裝,速度非常快。
2.很好理解操作文件的能力。換句話說,如果磁盤空間不足,將文件移動到其他位置很容易。
3.病毒可以掃描文件何時「靜止」。這使您可以利用掃描儀更新。

文件缺點
1.在多網絡服務器環境中,需要訪問的份額。還應該將其集羣以進行故障轉移。
2.處理文件訪問的其他安全要求。您必須小心,Web服務器和/或共享不允許執行文件。
3.交易備份必須考慮文件系統。


以上說,SQL 2008有一個名爲FILESTREAM的東西,它結合了兩個世界。您上傳到數據庫,並將文件透明地存儲在磁盤上的目錄中。在檢索時,您可以從數據庫中提取數據;或者您可以直接轉到它在文件系統上的位置。

0

我喜歡將圖像存儲在數據庫中。通過更改數據庫(不復制文件),它可以輕鬆地從開發切換到生產。數據庫可以像創建/修改日期一樣跟蹤文件系統一樣的屬性。

0

我個人從未將圖像存儲在數據庫中用於性能目的。在我的所有網站中,我都有一個「/ files」文件夾,我可以根據我要存儲的圖像放置子文件夾。然後我按照慣例命名它們。

例如,如果我要存儲個人資料照片,我會將其作爲profile_2.jpg(如果2是該帳戶的ID)存儲在「/ files/profile /」中。我總是會將服務器上的圖像大小調整爲我需要的最大尺寸,如果我需要它們,則尺寸更小。所以我會保存「profile_2_thumb.jpg」和「profile_2_full.jpg」。

通過創建自己的規則,你可以簡單地在代碼調用IMG SRC =「/文件/ profile__thumb.jpg」

那我該怎麼做吧!在DB存儲二進制文件的

4

優點:

  • 一些降低複雜性,因爲你的系統的 數據訪問層需要 網卡到一個數據庫,而不是一個DB + 文件系統。
  • 您可以使用基於全面權限的 安全性來保護文件,該安全性可保護數據庫的其餘部分。
  • 您的二進制文件通過數據庫備份的方式受到保護 不會丟失數據以及其餘 您的數據。 不需要單獨的文件系統備份系統 。在數據庫中存儲二進制文件的

缺點:

  • 根據文件的大小/數量, 會佔用顯著空間 潛在地降低性能 (你的二進制 文件是否存儲dependening在 表中經常查詢其他內容或 而不是),並作出更長時間的備份 次。在文件系統中存儲二進制文件的

優點:

  • 這是文件系統的良好 。文件系統將處理 的碎片整理和檢索 文件(比如說通過網絡服務器將視頻文件流式傳輸到 )可能會比使用db更快地執行 。在文件系統中存儲的二進制文件的

缺點:

  • 稍微更復雜的數據訪問 層。需要自己的備份系統。 需要考慮參考 完整性問題(例如,刪除 數據庫中的指針將需要 導致刪除文件,以便 文件系統中沒有'孤立'文件)。

總而言之,我會使用文件系統。在過去,使用SQL Server 2005,我只是簡單地將分表中的「指針」存儲到二進制文件中。指針通常是一個GUID。

如果您使用的是SQL Server 2008(也可能是其他人 - 我不知道),那麼這裏有個好消息:內置支持新的VARBINARY(MAX)FILESTREAM數據類型的混合解決方案。這些行爲在邏輯上類似於VARBINARY(MAX)列,但在幕後,SQL Sever 2008會將數據存儲在文件系統中。

+0

當我開始輸入時,還沒有答案。 SO正在成爲一個快速打字員勝出的問答節目! :) – Emmanuel 2010-01-08 16:18:32

+0

我想你實際上打了我一兩分鐘。 – NotMe 2010-01-08 21:43:29

2

沒有最好的辦法。

什麼?你需要更多信息?

我知道有三種方法......一種是數據庫中的字節數組。二,作爲存儲在數據庫中的路徑的文件。三,作爲混合動力(只有在DB允許的情況下,比如FileStream類型)。

第一個很酷,因爲你可以在同一步驟查詢和獲取你的數據。這總是很好。但是當你有很多文件時會發生什麼?你的數據庫變大了。現在,您必須處理大型數據庫維護問題,例如備份超過TB的數據庫的試驗。如果你需要外部訪問這些文件會發生什麼?如類型轉換,批量操作(調整所有圖像,appy水印等)?它比你有文件時要難得多。

第二個適用於大量文件。您可以將它們存儲在NAS設備上,逐步備份它們,保持數據庫較小等等。但是,當您擁有大量文件時,您將開始在文件系統中遇到限制。如果你通過網絡傳播它們,你會遇到延遲問題,用戶權利問題等。另外,如果你的網絡被重新安排,我會對你感到遺憾。現在,您必須在數據庫上運行大量更新以更改您的文件位置,如果出現問題,我很可惜。

然後是混合選項。它幾乎完美 - 您可以通過查詢獲取文件,但數據庫並不龐大。這是否解決了所有問題?可能不會。你的數據庫不再是可移植的;你被鎖定到一個特定的DBMS。而這個東西還不成熟,所以你可以享受初期化的過程。誰說這解決了所有不同的問題?

事實是,沒有「最好」的方式。你只需要確定你的要求,根據他們做出最好的選擇,然後當你發現你做錯了事情時就把它弄糟。

+0

感謝Will,我正在研究使用FileStream,但是由於您提出的問題,您的答案讓我重新思考! – JLWarlow 2010-12-09 15:11:26

相關問題