圖片存儲功能設(shè)計與優(yōu)化經(jīng)驗總結(jié)
文章簡介
本文通過對一個小型電商系統(tǒng)的圖片存儲模塊分析與總結(jié),分享如何設(shè)計一個適用的圖片存儲功能。
常見圖片存儲方式
在日常的系統(tǒng)設(shè)計中,難免會涉及到圖片功能,例如商品的圖片、文章封面圖、用戶頭像等等。一般常規(guī)的方式對數(shù)據(jù)創(chuàng)建一個圖片的字段,這個字段存儲的就是文件的路徑。如下面的格式:
| 數(shù)據(jù)編號 | 其他的字段 | 圖片字段 |
|---|---|---|
| 1 | ... | https://www.baidu.com/1.png |
| 2 | ... | https://www.baidu.com/1.png |
上述的數(shù)據(jù)表設(shè)計有好也有壞的地方:
優(yōu)勢:
存儲方式簡單,只需要用戶上傳圖片,獲取到圖片的url存儲起來即可。 展示方式簡單,客戶端只需要根據(jù)字段的值,顯示即可。
劣勢:
擴展性弱,如果后期我們的圖片更換了域名,需要針對所有的數(shù)據(jù)中的域名部分進(jìn)行替換。
多圖片擴展性弱,如果我們的某一條數(shù)據(jù)有多張圖片,這時候存儲的值可能是這種格式。圖片路徑1,圖片路徑2,....,圖片路徑n。雖然存儲起來簡單,但是在展示階段需要做數(shù)據(jù)格式的轉(zhuǎn)換,需要將字符串轉(zhuǎn)換為數(shù)組的格式進(jìn)行循環(huán)處理。
浪費存儲資源,假設(shè)有一張圖片a,在用戶頭像的時候上傳了一次,在商品圖片的時候也上傳了一次,這樣同一張圖片就會存儲兩次,多了一倍的存儲空間。
第2點提到了路徑問題,可能你會想我圖片里面不存儲具體的域名信息,只存儲圖片的名稱,在客戶端展示的時候進(jìn)行拼接即可。
$domain = 'https://www.baidu.com/';
$imageArray = ['1.png', '2.png', '3.png', '4.png'];
foreach ($imageArray as $value) {
$domain .= $value;
}
上面這種方式可以規(guī)避域名問題,但是也難免避免存儲方式問題。有可能系統(tǒng)前期適用的是七牛云存儲,后面適用了阿里云存儲,騰訊云存儲,這種就需要處理存儲方式。雖然也可以解決,但是讓系統(tǒng)設(shè)計起來顯得更加的復(fù)雜。
優(yōu)化思路
根據(jù)上面的問題,我們可以思考一下,如果將系統(tǒng)的所有圖片,都做成一個功能模塊,每一個需要涉及到圖片的地方,去調(diào)用這個模塊中的列表數(shù)據(jù),獲取到系統(tǒng)的圖片,這樣是不是會更好一些呢?如上圖,微信公眾號的圖片管理功能。左側(cè)是圖片的分類,右側(cè)是對應(yīng)的具體圖片。我們在需要使用圖片的地方,去獲取對應(yīng)的圖片數(shù)據(jù)即可。
同時,我們也有一個獨立的素材庫管理,可以查看系統(tǒng)的所有圖片,便于對圖片的管理。
方案設(shè)計
優(yōu)化思路提到了,我們單獨做一個圖片管理器。那我們數(shù)據(jù)表該具體怎么設(shè)計呢?我們這里以微信公眾號的圖片管理做演示。
首先我們有一個圖片的分類,這時候就需要一個圖片分類表(image_category)。
接下來,我們就需要創(chuàng)建一張具體的圖片表(image),用來存儲具體的圖片數(shù)據(jù)。

圖片分類主要就是分類的名稱、排序、創(chuàng)建時間等等信息。

圖片信息表存儲的字段就相對比較多一些。有圖片分類的id、存儲域名、圖片的名稱、圖片的url、圖片的大小、圖片的類型等信息。
表中拿一個字段存儲域名,客戶端在獲取到域名和圖片的名稱時,直接拼接起來就是一個圖片的完成路徑。
圖片的大小和圖片的擴展名,方便后期我們在頁面上進(jìn)行展示。有的系統(tǒng)可能會展示圖片的大小。
方案總結(jié)
通過上面的設(shè)計,我們可以總結(jié)出如下幾點優(yōu)勢:
優(yōu)化了圖片的存儲空間,避免同一張圖片多次上傳,占用系統(tǒng)的存儲空間。
如果涉及到不同的存儲平臺,我們圖片中有域名字段,直接將域名和圖片名稱進(jìn)行拼接即可。后期不管是換了多少個存儲平臺,系統(tǒng)也不會有任何影響。
便于系統(tǒng)對圖片的管理,這樣將圖片存儲獨立出來,方便查看系統(tǒng)的所有圖片數(shù)據(jù)。
涉及到業(yè)務(wù)數(shù)據(jù)的表,只需要去關(guān)聯(lián)圖片表中的id即可。
