PHP我应该将图像路径存储在数据库中吗?

时间:2011-08-18 23:12:23

标签: php mysql database image store

我将拥有一个包含许多公司的网站,每家公司都可以上传他们的徽标。为每个注册的公司创建一个文件夹是个好主意,所以它会是 companies / user1 / logo.jpg companies / user2 / logo.jpg 并将每个人都存储在一个文件夹中,这样我就不需要路径来引用图片了?

或者我应该将它们存储在一个文件夹中,例如 company_logos / gaegha724252.jpg ,它们都是随机文件名,路径是否会存储在与该公司关联的数据库中?

有哪些优点和缺点?

谢谢!

5 个答案:

答案 0 :(得分:11)

使用文件夹进行组织

优势:对于在后端摆弄系统的人来说,它们在逻辑上是清晰的 - 这就是真的。

缺点:当您删除公司等时,“更难”清理,并且您必须确保没有任何目录名称重叠,通常更多的工作从开始。

在一个文件夹中使用图像

优势从技术上讲,清理起来要容易一些,而不是那么多工作。

缺点您必须至少编写一个非常基本的碰撞检测算法和一个非常基本的“随机名称生成器”。

使用数据库存储图像

警告:在这个论点中已经失去了许多生命!

优势:参照完整性,备份/恢复更简单,分类

缺点:充满陷阱,可能更慢,更先进的存储/检索技术,潜在的性能问题以及网络请求的增加。此外,大多数廉价的托管服务提供商的数据库太可怕了,这不是一个好主意。

高度建议只使用散列文件名并将其(文件名)存储在数据库中,然后将图像存储在磁盘上的文件夹(或多个文件夹)中。从长远来看,这应该会容易得多,而且一般表现更好而不会太复杂。

答案 1 :(得分:6)

我会更进一步:在将每个文件存储到文件系统之前计算每个文件的MD5总和。您可以使用前两个字符作为第一级的目录名,接下来的两个字符作为第二级的目录:

vv 1st level
61f57fe906dffc16597b7e461e5fce6d.jpg
  ^^ 2nd level

由于散列算法具有相同的分布,这将在文件夹之间平均分配您的文件(这个想法来自Squid如何组织它的文件缓存)。服务器应该返回这样的URL(例如,没有关于目录的概念):

http://server.com/images/61f57fe906dffc16597b7e461e5fce6d.jpg

你可以申请mod_rewrite来实际重写这个网址:

/storage/images/61/f5/7fe906dffc16597b7e461e5fce6d.jpg

这也会增加一定程度的匿名性并隐藏真实的图像名称。此外,如果您的客户打算上传相同的内容,它将最终在同一个文件中,这将节省您的磁盘空间。从一个客户端删除文件时要小心:其他人也可以使用它!

答案 2 :(得分:1)

将它们存储为“company_logos / 125.jpg”,其中125是唯一ID(数据库中的主键)。

答案 3 :(得分:1)

根据您预期的公司数量,为每家公司创建一个文件夹很快就会变得荒谬。此外,从磁盘读取文件夹结构比从数据库读取要慢得多。

您可以将图像位置存储在数据库中,也可以使用ID解决方案。如果需要,您还可以使用“blob”类型将图像本身存储在数据库中。虽然其他问题已经解决了这个问题: Storing Images in DB - Yea or Nay?

我认为最好将图像名称存储在数据库中,或者使用ID方法。

答案 4 :(得分:0)

如果它只是几百条左右的记录,我就不会在数据库外存储图片了。