私はたくさんの選手とチームを持っています。チームは多くのプレイヤーで構成されています。プレイヤーは複数のチームに所属できます。特定のチームに所属しているプレーヤー、または特定のプレーヤーが所属しているチームを見つける必要があります。
DBRefs、チームが埋め込まれたプレーヤー コレクション、プレーヤーが埋め込まれたチーム コレクション、両方のコレクション、または他の何かを使用するのが最善でしょうか?それとも、ここでは MongoDB はまったく良い選択ではありませんか?
私はたくさんの選手とチームを持っています。チームは多くのプレイヤーで構成されています。プレイヤーは複数のチームに所属できます。特定のチームに所属しているプレーヤー、または特定のプレーヤーが所属しているチームを見つける必要があります。
DBRefs、チームが埋め込まれたプレーヤー コレクション、プレーヤーが埋め込まれたチーム コレクション、両方のコレクション、または他の何かを使用するのが最善でしょうか?それとも、ここでは MongoDB はまったく良い選択ではありませんか?
このページだけでなく、MongoDB のスキーマ設計に関する他の複数の議論も読んでいただければ幸いです。同様の例や、他の人々が考慮していることを確認することは非常に役立ちます。
そうは言っても、データセットが非常に大きくなるとは思えません。そうですか? その場合は、おそらくパフォーマンスに大きな問題はなく、アプリケーションからのアクセスを明確にし、簡単にするために最初に設計するよう努めるべきでしょう。
チームのコレクションとプレーヤーのコレクションを用意してから、そのチームのメンバーを表すプレーヤーの配列を各チームに埋め込むか、各プレーヤーのドキュメントにチームの配列を埋め込むかを決定するのが合理的だと思います彼らが所属しているチームを示します。配列は、ID の配列、または ID と名前などの配列である可能性があります。
上記のいずれを選択しても、クエリは簡単です。プレーヤーにチーム配列が埋め込まれている場合、特定のチームのすべてのプレーヤーを見つけるには、配列にそのチームを持つすべてのプレーヤーをクエリするだけです。クエリは次のようになります。
db.players.find({"teams.name":"TeamRocky"})
これにより、「teams」配列にそのチーム名を持つプレーヤーのすべてのプレーヤー ドキュメントが返されます (これは単なる例であり、実際の実装はまったく異なる場合があります)。代わりに、各チーム ドキュメントにプレーヤー配列を埋め込めば、同じくらい簡単になります。
これを決定する際に考慮すべきことは、データのクエリ方法だけでなく、データの更新方法と頻度 (プレーヤーがチームからチームへと移動するかどうか) も含める必要があります。チームは解散しますか?もしそうなら、彼らの履歴情報などを追跡する必要がありますか?
いくつかのスキーマを試して小さなプロトタイプを作成し、問題があると思われるものを確認し、アプリケーションの要件に慣れるにつれてスキーマを変更/進化させることをお勧めします。