database - 将每个 AWS S3 文件作为单独的行存储在数据库中?

标签 database database-design amazon-s3 amazon-web-services filesystems

我知道alot has been said on SO on how a file should be represented in a database但我找不到任何深入探讨如何存储多个相关文件的 Stackoverflow 问题。

我正在使用 Amazon S3,并将图像分组到单个 S3 存储桶中的相册(即“文件夹”)中。我读过,至少将文件路径存储在一个数据库中是一个好习惯。

我的问题是如何处理所有具有相同“文件夹”路径的多个 文件。这是我的 S3 结构:

my-bucket/folder1/img1a.jpg
my-bucket/folder1/img1b.jpg

my-bucket/folder2/img2a.jpg
my-bucket/folder2/img2b.jpg

一些问题:

  1. 我应该在我的数据库中用 2 行还是 4 行表示它?
  2. 如果每张图片实际上都作为不同大小(40x40、480x320)的多张图片存储在 S3 中,那么最好如何将该信息保存在我的数据库我的存储桶中?
  3. 查看 AWS S3 SDK,我不知道如何获取特定“文件夹”中的所有文件 URL。我错过了什么吗?

最佳答案

首先,根据之前的回答和对话,我想说的是,在您遇到需要解决的问题之前,不要担心数十亿行。如果您只是设计一些全新的服务,则可能无需担心如何立即管理数十亿张图像。尝试处理可以为数十亿个文件提供服务的高可用性、低延迟服务是一项设计挑战,世界上一些最优秀的工程师可能需要数年时间才能设计和实现。

或许可以将注意力降低几个数量级,以思考您将如何处理数百万或数千万条记录,或者您在未来一两年内需要管理的任何现实级别的对象。在这种情况下,确实没有理由,例如,具有设计良好的索引的 MySQL 安装无法处理具有数百万行且响应时间良好的表的查询,特别是如果您了解访问模式并且能够缓存频繁请求的文件元数据。

至于关系数据库是否是存储文件元数据的最佳方式,实际上取决于您要存储的数据的层次结构以及您的访问模式(即您将如何查看上数据)。您给出了一个非常基本的示例,说明您的文件将如何组织,并建议可能存在某种组织结构,其中每个图像都以多种分辨率存储。

您的应用程序是否需要了解图像的所有分辨率选项并根据某些标准决定提供最佳分辨率,或者您是否始终知道要检索的确切图像?

在第一种情况下,您可能需要一个 NoSQL 类型的元数据存储,以便您可以查找图像组并使用应用程序逻辑从组中选择最佳图像文件。在后一种情况下,您最好使用关系数据库,甚至是高度可用的键值存储(如 SimpleDB 或类似数据库)来获取文件元数据。

此外,关于实际提供图像,您可能需要考虑实际使用 Cloudfront 来提供您的 S3 文件,因为这也会给您带来一些延迟优势。

关于您关于 S3 中“文件夹”的问题,重要的是要了解 S3 中实际上并没有文件夹。人们通常使用类似文件夹的命名方案来命名他们的文件,以可能建议对存储桶中的文件进行一些层次分组,但实际上没有物理目录结构,也没有执行通常与目录结构相关的事情的能力(比如列出所有文件在一个目录)。所有文件仅存在于存储桶级别。

这是一个 files 表(如果使用 SQL 或变体):

file_id  folder_id     file_path
  1          1       http://s3.aws.amazon.com/my-bucket/folder1/img1a.jpg
  2          1       http://s3.aws.amazon.com/my-bucket/folder1/img1b.jpg
  3          2       http://s3.aws.amazon.com/my-bucket/folder2/img2a.jpg
  4          2       http://s3.aws.amazon.com/my-bucket/folder2/img2b.jpg

在这里,file_id 将是具有自动增量字段的主键,而 folder_id 将是一个带有索引的 int 列,以提供一种简单的方法来查找特定文件夹中的所有文件。

关于database - 将每个 AWS S3 文件作为单独的行存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096313/

相关文章:

MySQL数据库设计。如何在关系数据库中使用日期?

php - Mysql -> 用户表中可以有多少列?我应该存储数组吗?

mysql - 在表中更改我的 PK

php - Amazon Cloudfront 私有(private)分发 - CSS 内图像的链接

c# - "SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects"

database - Docker-使用Sequel Pro连接到数据库

Sql Server,使用自引用外键构建非循环父子关系

android - TransferManager 在网络问题上的行为

go - 如何在golang中将*multipart.FileHeader文件类型转换为*os.File

mysql - 如何在具有特定别名的表上正确选择 MySql 函数值?