优化 Amazon S3 上的照片存储命名法



我必须存储大量照片(+1 000 000,一张最大5MB(,我有一个数据库,每条记录有5张照片,所以最好的解决方案是什么:

  • 为每条记录的 slug/id 创建目录,并在其中上传照片
  • 将所有照片放入一个目录中,并在名称中包含记录的ID或辅助数据域
  • 将所有照片放入一个目录中,并在数据库中添加到每个记录字段中,并添加照片名称。

我使用 Amazon S3 服务器。

我建议您在批量上传时像这样命名您的照片:

用户 1/图像 1.jpeg

用户 2/图像 2.jpeg

虽然这些名称不会影响对象在 s3上的存储方式,但这些名称只是"对象"的"键">,因为 s3 中没有像分层结构这样的文件夹,但这样做会使对象出现在文件夹中,这将有助于轻松隔离图像,如果你以后想这样做。

例如,假设您存储了所有具有唯一名称的图像,并且您使用唯一的UUID将数据库中的记录映射到存储桶中的图像。

但稍后假设您想要特定用户的所有 5 张照片,那么您要做的就是

  1. 扫描数据库中的特定用户名
  2. 检索该用户图像的 UUID
  3. 然后使用 UUID 从 s3 获取图像

但是,如果您通过为其添加前缀来命名图像,则可以直接从 s3 获取图像,而无需对数据库进行任何引用。

例如,要列出user1的所有照片,您可以在python中使用这个小代码片段:

import boto3
s3 = boto3.resource('s3')
Bucket=s3.Bucket('bucket_name')
for obj in Bucket.objects.filter(Prefix='user1/'):
print(obj.key)

而如果你没有在对象的键中使用任何user-id,那么你必须参考数据库来做照片和记录之间的映射,即使只是为了获得特定用户的图像列表

这在很大程度上取决于您的用例,例如如何使用数据库和照片。这里没有足够的信息来给出明确的答案。

但是,对存储方面的一些建议...

最简单的选择是为每张照片使用UUID。这实际上是一个没有意义的随机名称。将该名称存储在数据库中,系统将知道哪个图像与哪个记录相关。无需重命名图像,因为这些名称只是唯一 ID,不传达更多信息。

当您想要提供对特定映像的访问权限时,您的应用程序可以生成一个 Amazon S3 预签名 URL,该 URL 授予对对象的限时访问权限。过期时间过后,URL 将不起作用,因此对象保持私有。以这种方式授予访问权限意味着无需按"所有者"将图像分组到目录中,因为访问权限是按对象而不是按所有者授予的。

另外,请注意,Amazon S3 实际上并不支持文件夹。相反,对象的("文件名"(是整个路径(例如user-2/foo.jpg(。这使得它更易于人类阅读(因为对象"看起来"在文件夹中(,但实际上不会影响数据在幕后的存储方式。

底线:如何存储图像并不重要。重要的是将映像名称存储在数据库中,以便知道哪个图像与哪个记录匹配。避免需要重命名图像的情况 - 只需给它们一个名称并保留它。

最新更新