【问题标题】:Image Gallery System - Which Approach is Better?图片库系统 - 哪种方法更好?
【发布时间】:2012-02-04 23:29:07
【问题描述】:

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

  • 有类别
  • 允许用户评论图片
  • 允许对图片进行评分

为此,我想到了两种方法:

1。实现按文件夹分类

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

优点

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

缺点

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

2。实现按数据库分类

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

优点

  • 轻松实现多类别
  • 仅保存图像名称

缺点

  • 看起来更乱了
  • 需要大量查询数据库。

你觉得哪个更好?还是我缺少第三种完全不同的方法?

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

希望收到您的来信。

【问题讨论】:

标签: php gallery


【解决方案1】:

我相信第二个选项更好,数据库给你更多的灵活性,而且我认为如果你设置正确的索引,性能比文件系统更好。

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

db比较乱的con,抱歉我找不到原因db会比较乱,可能你的意思是文件系统上没有组织文件,但是你还是需要整理文件系统并将它们划分到多个文件夹以获得更好的性能,如果您想获取所有已上传的图像,您可以查询所有图像的数据库,这将比所有类别文件夹上的 ls 快得多。
在使用DB方法时在文件系统中组织文件我的意思是您需要将它们分成几个文件夹,实际上这取决于您预测图像的上传方式:

  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”

需要大量查询数据库的第二个问题并不完全正确,因为您将需要在文件系统上进行相同数量的查询,但速度要慢得多。

祝你好运。

PS 不要忘记为任何已上传的图像生成一个新的文件名,这样在不同的用户上传相同的图像名称或相同的用户时不会发生冲突。

【讨论】:

  • 如何组织?你能举个例子吗? (您可以编辑自己的答案)
【解决方案2】:

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

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

【讨论】:

  • 我明白了!但这意味着我将有一个巨大的文件夹,其中包含我所有的图像,不是吗?这听起来不太……好……
  • 您可以以任意方式细分文件夹。例如,如果图片的文件名(或上传时分配的标题)以A开头,则将其放在A文件夹中,如果是B则将其放在B文件夹中,等等。或者您可以按上传者细分,每个用户系统获取自己的目录。可能性是无穷无尽的。
【解决方案3】:

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

【讨论】:

  • 正确规范化的标签是什么意思?
  • 许多解决方案都在宣扬,您也倾向于将 tagid / catid 存储为逗号分隔值,但这不会被规范化,并且会在高级查询中造成问题。
【解决方案4】:

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

/b/e/beach001.jpg

至于你的困境,这根本不是问题。
根据您的情况,您可以自己说数据库是唯一的解决方案。

【讨论】:

  • 我还建议使用未连接到类别的文件夹结构。当您需要将图像分配给多个类别时会发生什么? :) 使用数据库存储数据,使用文件系统存储文件。您不需要通过体面的查询“大量查询数据库”。
  • 其实我以为我在强化你所说的。 (我打算做一个类似的答案 - 没有两个答案说同样的事情)
  • 有趣!这如何提高我的表现?此外,这如何使文件系统更可靠以及它如何帮助(纯粹是为了组织?)
  • @Truth 尝试将 10000 个文件存储在一个文件夹中,并让操作系统选择或列出它们。然后将该数字减少到 1000。感受性能提升。
  • 因此,通过将其划分为文件夹,我可以减少操作系统查找文件的时间吗?很有意思。谢谢,我试试
【解决方案5】:

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

是否将图像本身存储在数据库或文件系统中是一个单独的问题which is discussed here

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

上传日期:月/年

/uploaded_images
    /2010/01
    /2010/02

上传日期:月-年

/uploaded_images
    /2010-01
    /2010-02

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

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

成千上万的批次

/uploaded_images
    /00001000/
    /00002000/
    /00003000/

【讨论】:

  • 不,不,图像本身肯定会存储在文件系统中,对此毫无疑问,问题是如何构造它。
【解决方案6】:

我最终选择了这个问题的最佳答案:Effeciently storing user uploaded images on the file system

它就像一个魅力。谢谢大家的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多