我知道这个问题已被多次询问,但我的更多是关于存储多种尺寸的图像。
我已经决定将我的图片存储在文件系统中。所以,检查了!
通过输入类型=“文件”上传的每个主图像将使用php中的unid函数获得唯一ID:uniqid('fc_',true)
现在,我的困境是如何存储主图像的不同尺寸(或儿童)。
目前,主映像包含数据库中的记录(id,title,description,type,filename),它存储在文件系统中。主映像的不同大小直接移动到文件系统(数据库中没有记录),并使用主映像的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
因此,系统#1:主服务器的一条记录,子服务器没有数据库记录,并且有相应文件名的方便文本以将它们链接到主服务器。
系统#2:主人的一个记录,每个孩子的一个记录。无需在子文件名中添加方便的文本,因为列master_imageid会自动将它们链接到主文件。
有关什么是最佳解决方案的想法?
提前致谢
答案 0 :(得分:1)
我会建议基于文件系统的方法。这样,您就可以使用简单的字符串操作获取各种大小的文件名;优雅的,以数据库为中心的方法增加了额外的间接层 - 假设没有数据库缓存,您运行1个HDD读取以获取文件名+ 1个HDD读取以获得实际图像数据与1个RAM内连接获取文件名+ 1 HDD读取以获取实际图像数据。这与数据库的固有延迟相结合,往往不会描绘出那种漂亮的画作!
尽管如此,使用数据库可能会提供一些优势。如果你不希望你的用户巧妙地将“_small”粘贴到任何文件上以获得更小的版本,毫无疑问使用数据库可能会更有吸引力。但即便如此,还是有更好的选择,特别是在没有缓存的情况下。
如果用户通过简单的URL操作访问文件确实是一个问题,我认为如果您将唯一的图像ID与分辨率说明符连接起来,并且使用足够便宜的文本对文件名进行散列,您可能仍然可以节省时间。防范小范围哈希算法(MD5),以生成文件名。
请注意,在任何程度的缓存加入战斗的那一刻,所有这些方法都会在性能基础上被轻易击败。理想情况下,如果不希望URL被操作,您需要预先计算唯一的文件名并将它们存储在数据库中,并使用memcached / redis / whatever在运行时执行查找。
答案 1 :(得分:1)
为什么在每个数据库记录都有唯一的id字段时创建uniqueid?
image table
id, created_by, etc
所以如果记录id是234,那么文件名将是234.jpg或其他。如果您使用uniqueid()作为文件名,请确保检查文件名是否已存在。如果在同一微秒内以某种方式创建了两个文件,它们可能具有相同的唯一ID。
另外,为不同尺寸附加文字有什么问题?对我来说似乎是最好的方式。
234_thumb.jpg
234_small.jpg
234_large.jpg