6

MongoDBを使用してユーザープロファイルを保存していますが、GridFSを使用して各プロファイルの画像を保存したいと思います。

2つのドキュメントのリンクを比較する2つの方法は次のとおりです。

A)ファイルIDへの参照をユーザーのimageフィールドに保存します。

User: 
{
  "_id": ObjectId('[user_id here]'),
  "username": 'myusername',
  "image": ObjectId('[file_id here]')
}

B)ユーザーへの参照をファイルのメタデータに保存します。

File metadata: 
{
  "user_id": ObjectId('[user_id here]')
}

私は多くの点でそれが私次第であり、アプリの詳細に依存していることを知っています(それが役立つ場合はモバイルになります)が、いずれかの方法でそれを行うことに普遍的な利点があるかどうか疑問に思っています?

4

1 に答える 1

5

ここでの答えは、実際にはアプリケーションの使用パターンによって異なります。私の仮定(私を自由に訂正してください)は、最も可能性の高いパターンは次のようなものであるということです:

ユーザーの検索->ユーザーの検索->プロファイルの表示(画像の取得)

この一般的な使用例では、方法Aを使用して、プロファイルを表示するためのユーザードキュメントを検索します。これには、画像オブジェクトIDが含まれ、その後、そのIDを使用してファイルをフェッチします(2つの基本操作で完了です)。

注:GridFSからのファイルの実際のフェッチは、単一の論理操作として扱っています。実際には複数の操作が含まれますが、ほとんどのドライバー/APIはとにかくこれを覆い隠します。

方法Bでは、ユーザードキュメントを検索し、別のクエリを実行してファイルメタデータコレクション内の関連するuser_idを検索し、ファイルをフェッチする必要があります。私の計算では、これは3つの操作です(方法Aにはない追加の検索結果)。

それは理にかなっていますか?

もちろん、私の仮定が正しくなく、アプリケーションが(たとえば)画像駆動型である場合、クエリパターンは異なる答えを思い付く可能性があります。

于 2012-01-25T15:36:10.007 に答える