多媒體文件已經普遍應用在不少程序當中。好比用戶的頭像,汽車的產品圖片等等。javascript
從我我的以往的經驗來看,將文件的路徑存儲入數據庫,而後文件自己存儲於硬盤當中已經是萬年不變的解決方案。html
其實,存儲圖片路徑與存儲圖片文件自己,兩種方案都有很好的立足點,可是大部分程序員都是將文件存儲於數據庫以外。雖然,這種方法沒有什麼大問題,但的確是存在必定的風險的。java
下面就來論述一下關於將文件存儲於數據庫外部的缺點。git
一、垃圾回收問題。程序員
當你想刪除一張圖片時,你只可以刪除掉數據庫中的記錄,圖片文件是沒有辦法由SQL語句刪除的,你必須在你的高級程序中維護着這些圖片。保證在刪除數據行的同時刪除掉圖片文件。數據庫
二、文件不支持數據庫備份工具併發
當咱們備份數據庫的時候,是沒有辦法連同外部文件一塊兒備份的。因此在備份時,必須使用文件系統備份工具來同時備份外部圖片。數據庫設計
三、文件不支持SQL的訪問權限設置工具
外部文件會繞開經過GRANT和REVOKE SQL語句設定的訪問權限。SQL權限管理這對錶和列的訪問,但它們並不能應用到外部文件。post
四、圖片路徑不是SQL數據類型
圖片路徑並非SQL的數據類型,它只是一個字符串,數據庫並不會驗證這是不是一個有效的文件路徑。若是這個文件被重命名、移動或者刪除了,數據庫並不會自動更新對應的路徑。
一樣文件存儲於數據庫外部也有其優勢:
一、數據庫在沒有圖片的時候可以經意不少,由於圖片相比於簡單數據類型說更大。
二、當不包含圖片時,備份數據庫會更快而且備份的文件更小,雖然必須執行一次額外的文件備份,但比備份一個大型數據庫更容易管理。
三、圖片若是存儲於數據庫以外,那麼對圖片的預覽或者編輯就可以使用更簡單直接的處理方式。好比,常常要編輯或修改圖片,那麼存儲於數據庫以外就是很好的選擇。
存儲時,使用二進制BLOB存儲文件。
圖片存儲在數據庫中,不須要額外加載,也就不會存在文件路徑不正確的風險。
刪除一條記錄的同時也刪除了圖片。
更新記錄的時候會加鎖,所以不會有別的客戶端併發更新圖片。
數據庫備份會包含全部的圖片。
SQL權限控制對圖片也有效。
各類優缺點都有,依據本身的程序,斟酌選擇正確的解決方案吧。