参照とは、あるドキュメントから別のドキュメントへのリンク(参照と呼ばれます)を含めることで、データ間の関係を保存するものです。アプリケーションはこれらの参照を解決して関連データにアクセスできます。次の例では、 ドキュメントとcontact accessドキュメントにuser ドキュメントへの参照が含まれています。
参照により、データが複数のコレクションに分割され、重複が行われないため、正規化されたデータモデルが作成されます。
ユースケース
非正規化されたデータモデルはMongoDBのほとんどのユースケースで機能しますが、次の場合は埋め込みデータの代わりに 参照 を使用することを検討してください。
埋め込みを使用するとデータの重複が発生しますが、重複の影響を考慮するのに十分な読み取りパフォーマンス上の利点は得られません。 たとえば、埋め込みデータが頻繁に変更される場合。
複雑な多対多の関係または大規模な階層データセットを表す必要があります。
単独の関連エンティティを頻繁にクエリする必要があります。
多数のコレクション
状況によっては、関連情報を 1 つのコレクションではなく複数のコレクションに保存することもあります。
さまざまな環境とアプリケーションのログドキュメントを保存するサンプル コレクションlogsについて考えてみましょう。 logsコレクションには次の形式のドキュメントが含まれています。
{ log: "dev", ts: ..., info: ... } { log: "debug", ts: ..., info: ...}
ドキュメントの合計数が少ない場合は、ドキュメントをタイプ別にコレクションにグループ化できます。ログについては、logs_dev や logs_debug などの個別のログコレクションの保持を検討してください。
一般的に、コレクションの数が多い場合でもパフォーマンス上の大きな低下はなく、パフォーマンスが向上します。個別のコレクションは、高スループットのバッチする処理にとって非常に重要です。
多数のコレクションを持つモデルを使用する場合は、次の動作を考慮してください。
各コレクションには、数キロバイトの特定の最小オーバーヘッドがあります。
インデックスなしの読み取り操作は大量のメモリを消費する可能性があります。
各 データベースの場合、単一の名前空間ファイル(
<database>.nsなど)には、そのデータベースのすべてのメタデータが保存されます。各インデックスとコレクションには、名前空間ファイルに独自のエントリがあります。具体的な制限については、「 場所の名前空間の長さ制限 」を参照してください。
クエリ正規化データモデル
複数のコレクション内の正規化されたデータをクエリするために、MongoDB は次の集計ステージを提供します。
正規化されたデータモデルの例については、「ドキュメント参照を使用した 1 対多の関係のモデル化 」を参照してください。
さまざまなツリーモデルの例については、「モデルツリー構造 」を参照してください。