2009-07-12 126 views
3

首先,我注意到有很多關於這個問題,很多標記爲重複。我最終來到this one是否需要將圖像路徑存儲在數據庫中?

而這個問題的接受答案雖然部分解決了我的問題,但並沒有回答所有問題。

我的問題是,用戶上載圖像。我將路徑存儲在數據庫中,並將圖像文件存儲在文件系統中。 但是,我製作了該圖像的3個副本(大,中,小)。總而言之,我有4張圖片 - 原始的,大的,中等的,小的。

我應該所有4條路徑存儲在數據庫中,像這樣

ID |  original  | large  | medium  | small  | 
----+--------------------+-----------------+-----------------+----------------+ 
1 | /path/to/original | /path/to/large/ | /path/to/medium | /path/to/small | 

或只是存儲原始的路徑,並給予其他3的命名慣例,像這樣: car.jpg, car.jpg, large-car.jpg, medium-car.jpg, small-car.jpg

我覺得這種方式對數據庫來說不會那麼沉重,如果後來我想增加另一個尺寸(即額外小),我不必修改數據庫。

回答

7

如果給定行中的所有圖像都在同一個地方,我會說他們的基本路徑應該是它自己的列(而不是始終從原始圖像的完整路徑重新獲取基本路徑)。

如果數據庫中的所有圖像都位於同一位置,請不要將基本路徑存儲在此表中;在代碼中或在全局配置表中。

+0

嗯,這是一個博客。每個用戶都有他/她自己的目錄。每次用戶使用圖片創建博客時,我都會使用blogID創建一個新目錄,並且在該目錄內我計劃存儲所有4個圖像。 – sqram 2009-07-12 01:21:02

+0

然後,我要做的就是爲所有這些目錄的父對象定義一個常量,define('BLOG_IMAGE_BASE_PATH','/ images/go/here')`或者其他任何內容,理想情況下,函數getImagePath(){返回BLOG_IMAGE_BASE_PATH。 '/'。 $這個 - > blogID; }`,並從中組合圖像路徑。 – chaos 2009-07-12 01:24:18

1

對於各種尺寸的原始圖像肯定有一個固定的命名約定,這將幫助您生成已知的緩存鍵,以便您可以將圖像存儲在緩存中,例如memcache,這樣可以減輕db的負擔,服務器的磁盤I/O

2

好像你試圖過度使用數據庫。如何改變這種方法。

ImageID | UserID | name.. 
---------+---------+----- 
1  | 495  | car454.jpg 
2  | 495  | house.jpg 
3  | 44  | kittysmall.jpg 

並將所有的圖像存儲在一個地方。

IMAGES_PATH =「/路徑/到/圖像」

和名稱由圖像標識(自動遞增)的圖像,因此對於第五圖像,這將是5.ori.jpg或5.large.jpg等

這樣你就可以很容易地看到誰擁有什麼形象,也可以用相同的文件名上傳不同的圖像,而不必擔心。

+0

有趣。但是,這種方法會不會過度使用數據庫?我的意思是,對於上傳的每個圖片,它會進行4次插入交易。如果用戶上傳「car.jpg」,我會將其調整爲大,中,小。因此我會將car.jpg,small-car.jpg,large-car.jpg和medium-car.jpg插入數據庫;而不是僅僅插入「car.jpg」,並且當想要在博客中顯示所有4個圖像時,我會在原始圖像名稱後添加「small-」,「large-」,「medium-」(car.jpg ) – sqram 2009-07-12 16:41:35

+0

沒有lyrae,你仍然只使用一個插入。你會插入「car.jpg」並選擇自動遞增的ID作爲結果,假設它返回「5」。然後您可以保存「5-small.jpg」,「5-medium.jpg」和「5-large.jpg」。 – 2009-08-04 22:08:30

1

爲了概括一下,我想說如果你可以重新創建信息(因爲基數總是相同的,後面是用戶名),不要將它存儲在數據庫中。如果您以後想要更改無論什麼原因存儲圖像的目錄,都會遇到麻煩。

0

作爲一個小調整,我會試圖將生成的縮略圖等放在不同的路徑中(例如:../generated/),以確保您不會覆蓋源圖像,如果有人上傳名爲「car-large.jpg」的文件等

1

如果特定路徑除文件名外一致,爲什麼不爲路徑使用常量,然後將不同大小的圖像存儲在相應的目錄中,並僅引用數據庫中的文件名。

這裏的主要原則是避免數據庫和代碼中的重複信息。對於數據庫,您可以獲得更高的正常形式,並且可以實現DRY(不重複自己)代碼。

假設你的結構是一樣的東西

/家庭/用戶/網站/圖像/原廠/

/家庭/用戶/網站/圖像/小/

/家庭/用戶/網站/圖像/中/

/家庭/用戶/網站/圖像/大/

你可以使用常量中的信息。例如

PATH_ORIGINAL = /家庭/用戶/站點/圖像/原始/

PATH_SMALL = /家庭/用戶/站點/圖像/小/

PATH_MEDIUM = /家庭/用戶/站點/圖像/介質/

PATH_LARGE = /家庭/用戶/網站/圖像/大/

然後在你的代碼,你可以做類似

smallcar = PATH_TO_SMALL。 car.jpg;

或者只是在用於加載圖像的任何查詢輸出中插入適當的常量變量。

如果您需要調整目錄結構或在服務器之間移動代碼,而不是更新整個數據庫記錄(這可能更容易出錯並且容易出錯),您還有一處可以更改路徑。

相關問題