提问人:Madara's Ghost 提问时间:1/23/2012 最后编辑:CommunityMadara's Ghost 更新时间:2/4/2012 访问量:615
图片库系统 - 哪种方法更好?
Image Gallery System - Which Approach is Better?
问:
我正在PHP中实现一个图像上传系统,需要以下内容:
- 有类别
- 允许用户对图像发表评论
- 允许对图像进行评级
为此,我考虑了两种方法:
1.实现按文件夹分类
每个类别都有自己的文件夹,PHP 将通过这些文件夹检测类别。
优点
- 结构化的外观,易于定位的图像。
- 使用本机 PHP 函数来操作和收集有关文件夹和文件的信息
缺点
- 多重分类是一种痛苦
- 需要在数据库中保存完整路径
2. 实现按数据库分类
数据库中的每个图像都会有一个 catID(或多个 catID),PHP 将查询数据库以获取图像
优点
- 易于实现的多类别
- 仅保存图像名称
缺点
- 似乎更凌乱
- 需要大量查询数据库。
你认为哪个更好?还是我错过了第三种完全不同的方法?
请注意,我不需要代码,我可以自己实现它,我正在寻找要实现的内容。
很想听听你的意见。
答:
我倾向于使用数据库方法。你列出了大量查询数据库的需要作为一个缺点,但这就是数据库的构建目的。正如您自己所指出的,当涉及到属于多个类别的项目时,分层结构具有严重的局限性,虽然您可以使用本机 PHP 函数来导航树,但这真的比运行 SQL 查询更快或更有效吗?
当然,实际的文件数据需要放在某个地方,而 BLOB 说得委婉一点是有问题的,所以我会将实际文件存储在文件系统中,但有关图像的所有数据(元数据)最好放在数据库中。数据库为您提供的额外灵活性是值得的。
评论
仅使用文件夹来使文件存储可靠,每个文件夹存储一定数量的文件,即
/b/e/beach001.jpg
至于你的困境,这根本不是问题。
从你的条件来看,你可以自己说数据库是唯一的解决方案。
评论
我相信第二种选择更好,数据库为您提供了更大的灵活性,并且我认为如果您设置了正确的索引,则性能比文件系统更好。
在文件系统方法中,每个映像只能有一个类别,而在数据库中,您可以在一个映像上设置多个类别。
Db更乱的缺点,对不起,我在db中找不到原因,它会更乱,也许你的意思是文件没有在文件系统上组织,但你仍然需要在文件系统上组织文件并将它们划分到多个文件夹以获得更好的性能, 如果你想获取所有已上传的图像,你可以在数据库中查询所有图像,这将比所有类别文件夹的LS快得多。
在使用数据库方法时在文件系统中组织文件时,我的意思是您需要将它们划分为多个文件夹,实际上这取决于您如何预测图像的上传:
- 如果您预测上传将长时间传播,那么我认为最好将文件按时间(日、周、月)放在每个范围内的目录中,例如,如果我现在上传图像,它将转到 “/web_path/uploaded_photos/week4_2012/[some_generated_string].jpg”
- 如果您不知道如何预测上传,那么我建议您将文件划分为通用的文件夹,例如图像名称上 MD5 哈希中的前两个字母,例如,如果我的文件名是“photo_2012.jpg”,则哈希将是“c02d73bb3219be105159ac8e38ebdac2”,因此文件系统中的路径将是“/web_path/uploaded_photos/c/0/[some_generated_string].jpg”
第二个缺点是需要大量查询数据库,因为您需要在文件系统上进行相同数量的查询,而这些查询要慢得多。
祝你好运。
聚苯乙烯 不要忘记为已上传的任何图像生成新的文件名,这样上传的不同用户、相同的图像名称或同一用户就不会发生冲突。
评论
第二种解决方案(数据库)实际上是对数据进行分类的 TAG/LABEL 系统。 这就是要走的路,最大的例子是 Gmail 和 Stackoverflow。 您唯一需要注意的是如何对标签进行建模。如果标记未正确规范化,则从数据库进行查询将变得昂贵。
评论
由于您需要一个数据库来存储评论和评分,因此您也应该将类别存储在数据库中。稍后,您可能还想存储图像标题和描述;数据库允许你这样做。而且我不会担心经常查询数据库。
是将映像本身存储在数据库还是文件系统中是一个单独的问题,这里将讨论这个问题。
关于在文件系统中存储镜像的注意事项:不要在一个目录中存储数千张镜像;这可能会导致操作系统出现性能问题。相反,发明一种在子目录中组织图像的方法。您可以按日期、文件名、随机等对它们进行分组。一些约定:
上传日期: 月/年
/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/
评论
我最终选择了这个问题的最佳答案:有效地将用户上传的图像存储在文件系统上。
它就像一个魅力。感谢您的所有回答!
评论