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

时间:2012-01-23 09:48:37

标签: php gallery

我正在用PHP实现图像上传系统,以下是必需的:

  • 有类别
  • 允许用户对图片发表评论
  • 允许图片评级

为此,我有两种方法:

1。按文件夹实施分类

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

赞成

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

缺点

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

2。按数据库实施分类

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

赞成

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

缺点

  • 似乎更混乱
  • 需要经常查询数据库。

您认为哪个更好?或者是否存在我缺少的第三种完全不同的方法?

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

很想收到你的来信。

6 个答案:

答案 0 :(得分:3)

我认为第二个选项更好,DB提供了更多的灵活性,如果设置正确的索引,我认为文件系统的性能会更好。

在文件系统方法中,每个图像仅限于1个类别,在数据库中,您可以在图像上设置多个类别。

认为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“
  3. 需要经常查询数据库的第二个问题并不完全正确,因为在文件系统上需要相同数量的查询速度要慢得多。

    祝你好运。

    PS 您是否忘记为已上传的任何图像生成新文件名,以便不同用户上传相同图像名称或同一用户时不会发生冲突。

答案 1 :(得分:2)

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

当然,实际的文件数据需要去某处,并且BLOBS有点问题,因此我将实际文件存储在文件系统中,但所有关于图像的数据(元数据)都会更好。一个数据库。数据库为您提供的额外灵活性值得所涉及的工作。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

/b/e/beach001.jpg

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

答案 4 :(得分:1)

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

是否将图像本身存储在数据库或文件系统中是一个单独的问题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/

答案 5 :(得分:0)

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

它就像一个魅力。谢谢你的所有答案!