2009-07-12 167 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;

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

如果您需要调整目录结构或在服务器之间移动代码,而不是更新整个数据库记录(这可能更容易出错并且容易出错),您还有一处可以更改路径。

相关问题