相比NoSQL,關聯式資料庫為何不適合儲存影像? - Reddit

banq發表於2022-04-12

在SQL資料庫中儲存這些影像只會使web開發更加困難,大多數影像只是儲存在檔案系統中,資料庫中包含指向這些檔案位置的指標。
不要把影像儲存在任何一種資料庫中,真的,除非有一個特定的理由這樣做。

資料庫在從磁碟檢索資料時只會增加一層抽象。所以資料庫速度總是比較慢,將整個影像儲存在資料庫中是沒有意義的。此外,它會增加資料庫的大小,因此您可能會向雲端計算廠商支付更多費用(或者在資料中心內部花費更多)。
資料庫傾向於將所有內容都儲存在 RAM 中,並且 blob 很大,因此您最終會使用大量記憶體,將資料放入檔案系統的效率要高得多,這也意味著可以靜態提供內容,從而使充分利用 CDN 和瀏覽器快取。
使用資料庫中的影像,您必須將影像從資料庫伺服器返回到應用程式伺服器,然後將其傳送到客戶端,而檔案系統在理想情況下,影像已經在客戶端上,因此瀏覽器可以處理一切。
如果出於某種奇怪的原因必須將其儲存在資料庫中(例如:白痴老闆這麼說),那麼由於所有的花裡胡哨(多個索引,查詢處理複雜性),在關聯式資料庫中檢索影像仍然需要更多時間ETC)。

另外值得一提的是,它繫結了一個資料庫連線,否則該連線可能用於快速獲取應用程式邏輯所需的重要資料。
來自檔案系統的流式檔案資料仍會佔用伺服器連線,但與資料庫相比,您通常有更大的預算。對於使用共享資料庫的負載平衡應用伺服器來說尤其如此。

SQLite 比使用 fopen 從磁碟獲取檔案要快,但是SQLite 只有在處理 10KB 左右的檔案時才會更快。
如果SQLite 與 mongodb 相比,mongodb 會更快,因為它的 db 儲存在記憶體中,因此跳過磁碟檢索使其比關係 db 更快。

喜歡將檔案儲存在資料庫中的原因(特別是 MS SQL Server):
  • 符合 ACID 的事務
  • 空間不足錯誤
  • 良好的空間管理工具
  • 防止系統管理員刪除/移動檔案
  • 備份和恢復是一致的
  • 參照完整性約束

相關文章