是否需要在数据库中存储图像路径?

时间:2009-07-12 01:05:29

标签: php mysql storage

首先,我注意到有关于此的许多问题,批次标记为重复。

我最终来到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

我觉得这种方式对数据库来说不那么重,如果以后我想添加另一个大小(即超小),我就不用修改数据库了。

6 个答案:

答案 0 :(得分:7)

如果给定行中的所有图像都位于同一位置,我会说它们的基本路径应该是它自己的列(而不是始终从原始图像的完整路径重新导出基本路径)。 / p>

如果数据库中的所有图像都位于同一位置,请不要将基本路径存储在此表中;将它放在代码中或全局配置表中。

答案 1 :(得分:2)

好像你正试图过度使用数据库。这个方法怎么样呢。

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

将所有图像存储在一个地方。

IMAGES_PATH =“/ path / to / images”

按图像ID(自动增量)命名图像,因此对于第5张图像,它将是5.ori.jpg或5.large.jpg等

通过这种方式,您可以轻松查看谁拥有了哪些图像,并且用户也可以上传具有相同文件名的不同图像,而不必担心。

答案 2 :(得分:1)

对于原始图像的各种大小,确实有一个可靠的命名约定,这将帮助您生成已知的缓存键,以便您可以将图像存储在某些缓存中,如memcache,这可以减轻数据库和服务器上的负载磁盘i / o

答案 3 :(得分:1)

为了概括,我想说如果你可以重新创建信息(因为基数总是相同的,后面是用户名),不要将它存储在数据库中。如果您以后想要更改存储图像的目录,无论出于何种原因,您都会遇到麻烦。

答案 4 :(得分:1)

如果特定路径是一致的,除了文件名之外,为什么不使用路径的常量,然后只将不同大小的图像存储在适当的目录中,并仅引用数据库中的文件名。

这里的主要原则是避免在数据库和代码中重复信息。对于数据库,您可以获得更高的正常形式,并且对于您实现DRY的代码(不要重复自己)。

假设您的结构类似于

/家庭/用户/站点/图像/原始/

/家庭/用户/站点/图像/小/

/家庭/用户/站点/图像/中/

/家庭/用户/站点/图像/大/

您可以使用常量来获取该信息。 e.g。

PATH_ORIGINAL = / home / user / site / images / original /

PATH_SMALL = / home / user / site / images / small /

PATH_MEDIUM = / home / user / site / images / medium /

PATH_LARGE = / home / user / site / images / large /

然后在您的代码中,您可以执行类似

的操作

smallcar = PATH_TO_SMALL。 car.jpg;

或者只是在任何用于加载图像的查询输出中插入适当的常量变量。

额外的好处是,如果您需要调整目录结构或在服务器之间移动代码,而不是更新整个数据库记录,这可能会更有问题且容易出错,您可以在一个地方更改路径。

答案 5 :(得分:0)

作为一个小调整,我很想将生成的缩略图等放在不同的路径中(例如:../ generate /),以确保在有人上传文件时不会覆盖源图像叫'car-large.jpg'等。