我不知道是否可以對此類決策進行一般性觀察,因爲這確實取決於您正在嘗試執行的操作,以及優先級列表NFR(如性能和響應時間)對您的應用程序有多高。
如果你有很多用戶,上傳大量的二進制文件,以服務於大量的上傳的二進制文件,那麼你有一個情況,其中在數據庫中存儲文件的成本包括系統:
好處是
- 原子提交
- 縮放自帶數據庫(雖然W¯¯的MySQL也有一些問題W¯¯多節點等)
- 較少繁瑣和複雜的代碼來管理文件系統等
考慮您存儲到同一個用戶的情況文件系統,你將需要解決
- 縮放
- 文件名管理(用戶上傳的同名文件兩次等)
- 創建在DB相應的記錄以映射到磁盤上(周圍的一切和代碼)的文件
- 你的apache的configs後尋找使他們從文件系統
我們有一個類似的問題解決充當這對於我們的Grails網站而言,內容編輯們每天上傳數百張圖片。我們知道,通過應用程序來驅動所有這些需求的時候,它可以更好地用於其他處理,這是浪費的(鑑於預期的頁面需求將達到每週數百萬,我們絕對不希望圖像削弱我們)。
我們最終創建了上傳 - >文件系統解決方案。對於每個上傳的文件,DB元數據記錄都是與上傳過程一起創建和管理的(並且相反,在生成到圖像的GSP內容鏈接時讀取該記錄)。我們通過Apache直接根據瀏覽器請求的鏈接將請求從磁盤送到磁盤。但是,總是有一個但是,請記住,像文件系統一樣,每臺機器只有內容。
我們很難確保圖像重新同步到每個服務器上,因爲與位於羣集後面的DB不同,並且使羣集的行爲一致,文件被綁定到服務器上的物理位置。
您可能遇到的另一個問題是文件夾內容大小。當你開始擁有數以萬計文件的文件夾時,操作系統級別的文件夾掃描開始真正拖動。爲了避免這個問題,我們必須編寫代碼,將管理圖像上傳到yyyy/MM/dd/image.name.jpg文件夾結構中,以便沒有任何一個文件夾可以累積成千上萬的圖像。
我暗示的是雖然我們通過不使用數據庫來獲得BLOB存儲的性能,但這是以開發開銷和系統管理爲代價的。
哦,這聽起來不錯... :) – 2009-01-29 16:26:38