2011-10-09 109 views
8

使用mysql時,將圖像作爲BLOB存儲在數據庫中是一個壞主意,因爲它會使數據庫非常大,這對數據庫的正常使用是有害的。然後,最好將圖像文件保存在磁盤上並將其鏈接保存到數據庫中。在Mongo數據庫中存儲圖像文件,這是一個好主意嗎?

但是,我認爲這對於MongoDB是不同的,因爲增加數據庫文件的大小對性能的影響可以忽略不計(這是MongoDB可以成功處理數十億條記錄的原因)。

您認爲最好是將圖像文件保存在MongoDB上(如GridFS)以減少存儲在服務器上的文件數量;或者仍然保持數據庫儘可能小是更好的?

回答

10

問題不在於數據庫變大,數據庫可以處理這個問題(儘管MongoDB在這方面不如其他很多)。問題是,要發送數據到客戶端,它首先必須由數據庫移動到RAM中,然後複製到應用程序的內存中,然後交給內核以通過套接字發送。這浪費了大量的RAM和CPU週期。在文件系統中擁有大文件比較好的原因是複製它更容易,您可以要求內核直接將文件從磁盤傳輸到套接字。

將大文件存儲在文件系統中的缺點是分發起來要困難得多。使用數據庫以及類似於Mongo的GridFS的功能可以擴展。你只需要確保你不會一次把整個文件拷貝到應用程序的內存中,而是一次一個地拷貝。現在大多數Web應用程序框架都支持發送分塊的HTTP響應。

2

MongoDB的GridFS專爲這種存儲而設計,並且非常方便用於將圖像文件存儲在多個不同的服務器中,使所有服務器都可以使用它們。

5

答案是肯定的。回到老的洞穴時代,服務器有可變的文件系統,你可以改變。我們試圖擴大規模之前,這非常棒。

洞穴人現在用immutable deployments構建應用程序。 HerokuDokku就是這樣的例子。由於Web應用程序服務器沒有狀態,因此可以輕鬆創建,升級,縮放和銷燬它們。

由於我們仍然有文件,我們需要把它們放在某個地方。有幾種解決方案:nfs,我們的數據庫,某人elses數據庫。

  • nfs是一個'網絡文件系統',它可以讓您在網絡資源上進行文件I/O操作。如果你正在處理網絡,恕我直言,它不會增加很多價值,除非它是你已經知道的。

  • 我們的數據庫 - 對於MongoDB there are two options:(file> 16mb)? GridFS:BinData

  • 有人刪除了數據庫 - 有些是基本的,如Amazon S3,有些提供額外的服務,如Cloudinary或Dropbox。

如果您使用的是大預算的企業團隊,有人花了一週照顧的服務器,然後確保40個小時 - 使用的文件系統。如果您正在構建可伸縮的Web應用程序,那麼將文件放入數據庫是有道理的。

如果你關心性能:

1)使用代理(如nginx的)或CDN託管您的客戶端的內容。您的服務器應該只是提供緩存未命中。

2)使用流式IO Nodeschool has a cool tutorial for Node.js

0

存儲影像時,不會在任何DB是一個好主意,因爲:

  • 讀取/寫入DB總是比文件系統
  • 你的數據庫備份的增長是巨大的,更多的時間慢消費
  • 訪問的文件,現在需要經歷你的應用程序和數據庫層

最後兩個是真正的兇手。

來源:Three things you should never put in your database

所以,如果你可以讓你的應用程序狡猾,那麼最好不要上傳你的照片到MongoDB。然而,如果你接近截止日期......並且數據庫將會很小以至於它不會長大很多,並且它的大小永遠不會超過運行你的應用程序的機器上的可用RAM,那麼我認爲(而不是引用文章的作者),您可以考慮將圖像存儲在MongoDB中。它簡單,方便,快速實施,併爲您提供一些靈活性。

相關問題