9

読み取り負荷が高く、数百万のドキュメントを持つ可能性のあるアプリケーションを開発しています。ほとんどすべてのコレクションでユーザー情報を参照する必要があります。ユーザー情報には、時々変更される属性があります。

DBref を使用するか、すべてのコレクションにユーザー情報を埋め込む必要がありますか?

大量の読み取りアプリでの DBref のパフォーマンスはどれくらい悪いですか?

DBref を使用しない場合、ユーザー情報が定期的に変更される場合、各ドキュメントをどのように更新できますか?

Mongodb では、この種のユース ケースの DBref と埋め込みドキュメントに代わるものはありますか?

4

1 に答える 1

12

DBrefは、従来のリレーショナルシステムの外部キーのようなものではありません。参照されたドキュメントを自動ロードするようにドライバー(できる人)に簡単に指示する唯一の規則です。詳細については、 DBRefを参照してください。

使用するドライバーによっては、必要な場合(遅延)にのみこれらの参照を自動的にロードできる場合があるため、パフォーマンスのオーバーヘッドは非常に小さいはずです。ただし、ストレージオーバーヘッドは、別のドキュメントの単純な参照_idよりも少し高くなります。基本的に、リンクされたドキュメントが可変タイプである可能性がある場合にのみ、これらのDBrefを使用する必要があります。静的な場合は、_id-referencesと、おそらく独自のレイジーローダー機能で立ち往生しているので、繰り返す必要はありません。

MongoDBが推奨しているように(私もそうですが)、自分自身を繰り返さないでください(またはデータベース用語でのデータ重複)は、ドキュメントをリンクすることだけです。そうしないと、1つの論理エンティティ(物理的に非常に頻繁に複製される)のみを更新するために、ストレージ使用量が高くなり、更新がいくらか長く実行されます。

前述のカスタムレイジーローダーを使用すると、すべてのルックアップが実際にmongodbルックアップになるとは限らないように、キャッシュを追加できます。ほとんどの場合、キャッシュとデータベース間のデータの一貫性に注意する必要があります。

于 2012-06-13T06:50:44.463 に答える