3

データベースでファイルをどのように表現するかについてSOで多くのことが言われていることは知っていますが、複数の関連ファイルをどのように保存するかについて深く掘り下げたStackoverflowの質問は見つかりませんでした。

私はAmazonS3を使用しており、単一の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を取得する方法がわかりませんでした。私は何かが足りないのですか?
4

2 に答える 2

3

まず、以前の回答と会話から、問題が発生するまで、何十億もの行について心配する必要はありません。まったく新しいサービスを設計しているだけの場合は、何十億もの画像をすぐに管理する方法について心配する必要はないでしょう。数十億のファイルを処理できる高可用性、低遅延のサービスに対処しようとすることは、世界の最高のエンジニアの一部が設計と実装に何年もかかる可能性がある設計上の課題です。

おそらく、数桁低い焦点を当てて、数百万または数千万のレコード、または今後1、2年で管理する必要のある現実的なレベルのオブジェクトをどのように処理するかを考えてください。この場合、たとえば、適切に設計されたインデックスを使用した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列であり、特定のフォルダー内のすべてのファイルを簡単に検索する方法を提供します。

于 2012-10-27T05:01:20.080 に答える
1

質問していることから、ファイルIDとファイルパスの2つの項目を持つ「ファイルパス」テーブルが必要であるように見えます。

次に、データベースにパス用の4つの行と、追跡しているメタデータであるファイル自体用の1つの行があります。


あなたはAmazonサービスとデータベース設計についての質問を混同しています。そのために、それが来ると:

各画像が実際に異なるサイズ(40x40、480x320)の複数の画像としてS3に保存されている場合、その情報をデータベースとバケットに保持するのが最善でしょうか?

AWS S3 SDKを見ると、特定の「フォルダー」内のすべてのファイルを取得する方法がわかりませんでした。私は何かが足りないのですか?

アマゾンウェブサービスのプログラミングについては何も知りません。データベース内の1つのレコードを最大4回複製することによって発生する問題を回避するために、それらはおそらく内部的にシャーディングされるため、特定のフォルダーにすべてを取得することはおそらくできないと言えます。

その情報をデータベースとバケットに保存する方法については、「ビジネスニーズに一致する」としか言えません。

于 2012-10-27T02:02:21.733 に答える