【问题标题】:store multiple sizes of one image, filesystem or database approach存储一个图像、文件系统或数据库方法的多种大小
【发布时间】:2011-08-16 01:30:26
【问题描述】:

我知道这个问题已经被问过很多次了,但我更多的是关于存储具有多种尺寸的图像。

我已经决定将我的图像存储在文件系统中。所以,已经检查过了!

通过 input type="file" 上传的每个主图像都将使用 php 中的 unid 函数获得一个唯一的 id:uniqid('fc_', true)

现在,我的难题是如何存储主图像的不同大小(或子图像)。

目前,主映像包含数据库中的一条记录(id、标题、描述、类型、文件名),并存储在文件系统中。不同大小的主图像直接移动到文件系统(数据库中没有记录),并使用主图像的uniqid+一些添加的文本命名。所以:

Master:  fc_345679849.89675849.jpg  
size (30px) : fc_345679849.89675849_tiny.jpg  
size (50px) : fc_345679849.89675849_small.jpg  
size (100px) : fc_345679849.89675849_medium.jpg  
size (500px) : fc_345679849.89675849_large.jpg

当我开始更多地研究这个系统以及其他人是如何做到的时,我开始怀疑它是否是正确的方法。

我想到的另一种方法是存储每个图像(对图像的引用,而不是实际图像),包括在数据库中具有不同大小的图像。它们都有一个主键,如果适用,还有一个对主映像的引用,如下所示:

id, ..., filename, master_imageid  
_____________________________
1, ... , 34.jpg, NULL  
2, ... , 23.jpg, 1  
3, ... , 45.jpg, 1  
4, ... , 12.jpg, 1  
5, ... , 8.jpg, 1

所以图像 1 是主人,其余(不同大小)是主人的孩子......即图像 2、3、4、5

因此,system#1:master 的一条记录,children 没有 db 记录,并且有一个方便的文本到相应的文件名以将它们链接到 master。

System#2:主人一份记录,每个孩子一份记录。无需在子文件名中添加方便的文本,因为 master_imageid 列会自动将它们链接到主文件。

有没有想过什么是最好的解决方案?

提前致谢

【问题讨论】:

  • 数据库中的文件很少是一个好主意。将元数据存储在数据库中,并将文件系统用于存储文件。
  • 他提到他使用文件系统来存储数据——他已经将数据存储在数据库中
  • 当您处理 JPEG 图像时,如果您愿意使用 JPEG2000,则可以使用 JPIP,但对于您处理的尺寸而言,它可能不会带来显着的好处。 ..也许如果主人的尺寸很大。
  • 我不打算在数据库中存储文件图像。根据大小,我使用 Photoshop 另存为网络工具。它做得很好......

标签: php


【解决方案1】:

我建议使用基于文件系统的方法。这样,您可以使用简单的字符串操作来获取各种大小的文件名;以数据库为中心的方法虽然优雅,但增加了额外的间接层——假设没有数据库缓存,您正在运行 1 次 HDD 读取以获取文件名 + 1 次 HDD 读取以获取实际图像数据与 1 次 RAM 内连接获取文件名 + 1 HDD 读取以获取实际图像数据。这一点,再加上数据库倾向于引入的固有延迟,并没有画出漂亮的画!

也就是说,使用数据库可能会提供一些优势。如果您不希望您的用户巧妙地将“_small”附加到任何文件以获取更小的版本,那么毫无疑问使用数据库可能是一种更具吸引力的方法。但即便如此,还有更好的选择,尤其是在没有缓存的情况下。

如果用户通过简单的 URL 操作访问文件确实是一个问题,我认为如果您将唯一的图像 ID 与分辨率说明符连接起来,并使用足够便宜但又足够便宜的文件名对文件名进行哈希处理,我认为您仍然可以节省时间小范围哈希算法(想到 MD5)上的防冲突来生成文件名。

请注意,在任何程度的缓存加入竞争的那一刻,所有这些方法在性能方面都会被轻易击败。理想情况下,如果不希望 URL 可操作,您需要预先计算唯一的文件名并将它们存储在数据库中,并使用 memcached/redis/whatever 在运行时执行查找。

【讨论】:

    【解决方案2】:

    当每个数据库记录都已经有一个唯一的 id 字段时,为什么要创建一个唯一的 ID?

    image table
    id, created_by, etc
    

    因此,如果记录 id 为 234,则文件名将是 234.jpg 或其他。如果您使用 uniqueid() 作为文件名,请确保检查该文件名是否不存在。如果在同一微秒内以某种方式创建了两个文件,则它们可能具有相同的唯一 ID。

    另外,附加不同大小的文本有什么问题?对我来说似乎是最好的方式。

    234_thumb.jpg
    234_small.jpg
    234_large.jpg
    

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2014-05-04
      • 2011-06-10
      • 2012-06-26
      • 2011-01-05
      相关资源
      最近更新 更多