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

时间:2012-10-27 01:07:16

标签: 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. 如果每个图像实际存储在S3中作为不同大小的多个图像(40x40,480x320),那么最好将该信息保存在我的数据库中?
  3. 查看AWS S3 SDK,我无法弄清楚如何获取特定“文件夹”中的所有文件URL。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

首先,从早期的回答和对话中,我会说,不要担心数十亿行,直到遇到问题为止。如果您只是设计一些全新的服务,则可能无需担心如何管理数十亿的图像。尝试处理可提供数十亿个文件的高可用性,低延迟服务是一项设计挑战,世界上一些最优秀的工程师可能需要数年才能设计和实施。

或许可以集中几个数量级来考虑如何处理数百万或数千万条记录,或者在未来一两年内需要管理的任何现实级别的对象。在这种情况下,没有理由,例如,具有设计良好的索引的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列,可以方便地查找某个文件夹中的所有文件。

答案 1 :(得分:1)

根据您的要求,您看起来应该有一个“filepaths”表,其中包含两个项目:文件ID和文件路径。

然后,数据库中有4行用于路径,1行用于文件本身,即您要跟踪的元数据。


您正在混淆有关亚马逊服务和数据库设计的问题。为此,当涉及到:

  

如果每个图像实际存储在S3中作为不同大小的多个图像(40x40,480x320),那么最好将这些信息保存在我的数据库和我的存储桶中?

     

查看AWS S3 SDK,我无法弄清楚如何获取特定“文件夹”中的所有文件。我错过了什么吗?

我对亚马逊网络服务的编程一无所知。我可以说你可能无法将它们全部放在一个特定的文件夹中,因为它们可能在内部专门用于避免因数据库中的一条记录重复四次而导致的问题。

至于如何在您的数据库和存储桶中存储该信息,我只能说“符合您的业务需求”