图片库系统 - 哪种方法更好?

Image Gallery System - Which Approach is Better?

提问人:Madara's Ghost 提问时间:1/23/2012 最后编辑:CommunityMadara's Ghost 更新时间:2/4/2012 访问量:615

问:

我正在PHP中实现一个图像上传系统,需要以下内容:

  • 有类别
  • 允许用户对图像发表评论
  • 允许对图像进行评级

为此,我考虑了两种方法:

1.实现按文件夹分类

每个类别都有自己的文件夹,PHP 将通过这些文件夹检测类别。

优点

  • 结构化的外观,易于定位的图像。
  • 使用本机 PHP 函数来操作和收集有关文件夹和文件的信息

缺点

  • 多重分类是一种痛苦
  • 需要在数据库中保存完整路径

2. 实现按数据库分类

数据库中的每个图像都会有一个 catID(或多个 catID),PHP 将查询数据库以获取图像

优点

  • 易于实现的多类别
  • 仅保存图像名称

缺点

  • 似乎更凌乱
  • 需要大量查询数据库。

你认为哪个更好?还是我错过了第三种完全不同的方法?

请注意,我不需要代码,我可以自己实现它,我正在寻找要实现的内容。

很想听听你的意见。

PHP 图库

评论

0赞 hakre 1/23/2012
文件系统上有效存储用户上传的图像的可能重复项
0赞 Madara's Ghost 1/23/2012
这并不完全重复......但很相似,我也会看看那里的答案,谢谢。

答:

2赞 GordonM 1/23/2012 #1

我倾向于使用数据库方法。你列出了大量查询数据库的需要作为一个缺点,但这就是数据库的构建目的。正如您自己所指出的,当涉及到属于多个类别的项目时,分层结构具有严重的局限性,虽然您可以使用本机 PHP 函数来导航树,但这真的比运行 SQL 查询更快或更有效吗?

当然,实际的文件数据需要放在某个地方,而 BLOB 说得委婉一点是有问题的,所以我会将实际文件存储在文件系统中,但有关图像的所有数据(元数据)最好放在数据库中。数据库为您提供的额外灵活性是值得的。

评论

0赞 Madara's Ghost 1/23/2012
明白了!但这意味着我将有一个巨大的文件夹,里面有我所有的图像,不是吗?这听起来不是很......好。。。
0赞 GordonM 1/23/2012
您可以以某种任意方式细分文件夹。例如,如果图像的文件名(或上传时分配的标题)以 A 开头,则将其放在 A 文件夹中,如果是 B,则将其放在 B 文件夹中,依此类推。或者你可以按上传者细分,系统的每个用户都有自己的目录。可能性是无穷无尽的。
1赞 Your Common Sense 1/23/2012 #2

仅使用文件夹来使文件存储可靠,每个文件夹存储一定数量的文件,即

/b/e/beach001.jpg

至于你的困境,这根本不是问题。
从你的条件来看,你可以自己说数据库是唯一的解决方案。

评论

0赞 Leigh 1/23/2012
我还建议使用与类别无关的文件夹结构。当您需要将图像分配给多个类别时,会发生什么情况?:)使用数据库来存储数据,使用文件系统来存储文件。你不需要用一个体面的查询来“大量查询数据库”。
0赞 Leigh 1/23/2012
实际上,我以为我在强化你说的话。(我打算做一个类似的答案 - 让两个答案说同样的事情是没有意义的)
0赞 Madara's Ghost 1/23/2012
有趣!这如何提高我的表现?此外,这如何使文件系统更可靠,它如何提供帮助(纯粹是为了组织?
0赞 Your Common Sense 1/23/2012
@Truth尝试将 10000 个文件存储在一个文件夹中,并让操作系统选择一个或列出它们。然后将该数字减少到 1000。感受性能提升。
0赞 Madara's Ghost 1/23/2012
因此,通过将其划分为文件夹,我可以减少操作系统查找文件的时间吗?很有意思。谢谢,我会尝试的
3赞 Dolev 1/23/2012 #3

我相信第二种选择更好,数据库为您提供了更大的灵活性,并且我认为如果您设置了正确的索引,则性能比文件系统更好。

在文件系统方法中,每个映像只能有一个类别,而在数据库中,您可以在一个映像上设置多个类别。

Db更乱的缺点,对不起,我在db中找不到原因,它会更乱,也许你的意思是文件没有在文件系统上组织,但你仍然需要在文件系统上组织文件并将它们划分到多个文件夹以获得更好的性能, 如果你想获取所有已上传的图像,你可以在数据库中查询所有图像,这将比所有类别文件夹的LS快得多。
在使用数据库方法时在文件系统中组织文件时,我的意思是您需要将它们划分为多个文件夹,实际上这取决于您如何预测图像的上传:

  1. 如果您预测上传将长时间传播,那么我认为最好将文件按时间(日、周、月)放在每个范围内的目录中,例如,如果我现在上传图像,它将转到 “/web_path/uploaded_photos/week4_2012/[some_generated_string].jpg”
  2. 如果您不知道如何预测上传,那么我建议您将文件划分为通用的文件夹,例如图像名称上 MD5 哈希中的前两个字母,例如,如果我的文件名是“photo_2012.jpg”,则哈希将是“c02d73bb3219be105159ac8e38ebdac2”,因此文件系统中的路径将是“/web_path/uploaded_photos/c/0/[some_generated_string].jpg”

第二个缺点是需要大量查询数据库,因为您需要在文件系统上进行相同数量的查询,而这些查询要慢得多。

祝你好运。

聚苯乙烯 不要忘记为已上传的任何图像生成新的文件名,这样上传的不同用户、相同的图像名称或同一用户就不会发生冲突。

评论

0赞 Madara's Ghost 1/23/2012
如何组织?你能举个例子吗?(您可以编辑自己的答案)
2赞 shikhar 1/23/2012 #4

第二种解决方案(数据库)实际上是对数据进行分类的 TAG/LABEL 系统。 这就是要走的路,最大的例子是 Gmail 和 Stackoverflow。 您唯一需要注意的是如何对标签进行建模。如果标记未正确规范化,则从数据库进行查询将变得昂贵。

评论

0赞 Madara's Ghost 1/23/2012
正确规范化的标签是什么意思?
0赞 shikhar 1/23/2012
许多解决方案都说教,您也倾向于将 tagid / catid 存储为逗号分隔值,但这不会被规范化,并且会在高级查询中造成问题。
1赞 Salman A 1/23/2012 #5

由于您需要一个数据库来存储评论和评分,因此您也应该将类别存储在数据库中。稍后,您可能还想存储图像标题和描述;数据库允许你这样做。而且我不会担心经常查询数据库。

是将映像本身存储在数据库还是文件系统中是一个单独的问题,这里将讨论这个问题

关于在文件系统中存储镜像的注意事项:不要在一个目录中存储数千张镜像;这可能会导致操作系统出现性能问题。相反,发明一种在子目录中组织图像的方法。您可以按日期、文件名、随机等对它们进行分组。一些约定:

上传日期: 月/年

/uploaded_images
    /2010/01
    /2010/02

上传日期: month-year

/uploaded_images
    /2010-01
    /2010-02

图像名称的 MD5 哈希值:第一个字符

/uploaded_images
    /0/
    /1/
    .
    .
    .
    /e/
    /f/

数千批

/uploaded_images
    /00001000/
    /00002000/
    /00003000/

评论

0赞 Madara's Ghost 1/23/2012
不,不,图像本身肯定会存储在文件系统上,毫无疑问,问题是如何构建它。
0赞 Madara's Ghost 2/4/2012 #6

我最终选择了这个问题的最佳答案:有效地将用户上传的图像存储在文件系统上

它就像一个魅力。感谢您的所有回答!