【问题标题】:PHP Should I store image paths in a database?PHP 我应该将图像路径存储在数据库中吗?
【发布时间】:2011-10-30 05:22:02
【问题描述】:

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

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

有什么优点和缺点?

谢谢!

【问题讨论】:

    标签: php mysql database image store


    【解决方案1】:

    使用文件夹进行组织

    优势:对于在后端摆弄系统的人来说,它们在逻辑上是显而易见的——真的就是这样。

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

    在一个文件夹中使用图片

    优势从技术上讲,清理起来更容易一些,而且工作量也不大。

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

    使用数据库存储图像

    警告:许多人在这场争论中丧生!

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

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

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

    【讨论】:

    • 为了澄清您的最后一句话,您建议将 散列文件名 存储在数据库中,并将文件本身存储在文件系统中,对吗?另外,我要补充一点,将所有文件存储在一个文件夹中的一个缺点是,如果您最终在该文件夹中有大量文件,那么使用传统方法列出目录内容可能会变得异常缓慢;见here
    • 感谢您的出色回答。现在我明白了很多。
    • @Mitch:你说得对,我会将散列文件名存储在数据库中,而不是文件本身。将所有文件存储在一个文件夹中可能是一个缺点,但在它成为问题之前我们会谈论数百万。在这种情况下,将 dma_k 的策略与我的一起使用(理论上)会产生良好的效果。
    【解决方案2】:

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

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

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

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

    您可以申请mod_rewrite 来实际将此网址重写为如下内容:

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

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

    【讨论】:

    • 我喜欢它的创造力和(假设的)安全性。很酷。
    【解决方案3】:

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

    【讨论】:

    • 如果我允许他们上传 jpgs 和 pngs,我需要在数据库中添加一个地方来存储 logo 扩展名吗?
    【解决方案4】:

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

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

    我觉得最好要么把图片名存入数据库,要么用ID方法。

    【讨论】:

    • 如果您将图像的位置存储在数据库中,那么您不会读取文件夹结构,您只是直接进入文件系统上的图像。将数据库添加到混合中会增加一层额外的混乱,并且几乎总是(除非极不可能的情况)会变慢。
    【解决方案5】:

    如果它只有几百条左右的记录,我不会费心将图片存储在数据库之外。

    【讨论】:

    • 我不同意。将图片存储在数据库中,无论有多少,检索起来总是比将它们存储在文件系统上更复杂,而且很可能更慢(如果只有一点点)。最重要的是,您可能必须实现一些重要的缓存系统来减少数据库调用的数量(假设徽标会显示在大多数用户登录的页面上,如果不是所有页面的话)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多