埋め込みデータと参照の比較
効果的なデータモデルは、アプリケーションのニーズをサポートします。 スキーマ設計の 1 つの重要な決定は、データを埋め込むか、参照を使用するかです。
埋め込みデータモデル
関連データを単一のドキュメントに埋め込むことができます。 次の例では、 contact
とaccess
フィールドは埋め込みドキュメントです。
埋め込みデータモデルは、頻繁にアクセスされるデータが複数のコレクションに重複するため、多くの場合非正規化されます。
埋め込みデータモデルを使用すると、アプリケーションは同じデータベースレコード内の関連情報をクエリできます。その結果、アプリケーションでは一般的な操作を完了するために必要なクエリ数と更新数が少なくなります。
ユースケース
埋め込みデータモデルは、以下のシナリオで使用します。
エンティティ間に「含む」の関係がある場合。 たとえば、
address
を含むcontacts
ドキュメント。 「 ドキュメントを使用した 1 対 1 の関係のモデル化 」を参照してください。エンティティ間に1対多の関係がある場合。これらの関係では、「多数」または子ドキュメントが「1 つ」または親ドキュメントに関連して表示されます。「埋め込みドキュメントによる 1 対多の関係のモデル化」を参照してください。
埋め込みには、以下のようなメリットがあります。
読み取り操作のパフォーマンス向上
1 回のデータベース操作で関連データを取得できる
1 回のアトミックな書き込み操作で関連データを更新できる
埋め込みデータのクエリ
埋め込みドキュメント内のデータをクエリするには、ドット表記を使用します。 配列と埋め込みドキュメント内のデータのクエリの例については、以下を参照してください。
参考文献
参照とは、あるドキュメントから別のドキュメントへのリンク(参照と呼ばれます)を含めることで、データ間の関係を保存するものです。 次の例では、 contact
ドキュメントとaccess
ドキュメントにuser
ドキュメントへの参照が含まれています。
参照により、データが複数のコレクションに分割され、重複が行われないため、正規化されたデータモデルが作成されます。
ユースケース
次のシナリオで関連データをリンクするには、参照を使用します。
埋め込みを使用するとデータの重複が発生しますが、重複の影響を考慮するのに十分な読み取りパフォーマンス上の利点は得られません。 たとえば、埋め込みデータが頻繁に変更される場合。
複雑な多対多の関係または大規模な階層データセットを表す必要があります。
関連エンティティは、単独で頻繁にクエリされます。たとえば、
employee
データとdepartment
データがある場合、employee
ドキュメントに部門情報を埋め込みたいと考えるかもしれません。ただし、部門リストを頻繁に検索する場合は、リファレンス付きでemployee
コレクションにリンクされた別のdepartment
コレクションを使用するとアプリケーションのパフォーマンスが最大限に高まります。
クエリ正規化データモデル
複数のコレクション内の正規化されたデータをクエリするために、MongoDB は次の集計ステージを提供します。
正規化されたデータモデルの例については、「ドキュメント参照を使用した 1 対多の関係のモデル化 」を参照してください。
さまざまなツリーモデルの例については、「モデルツリー構造 」を参照してください。
詳細
MongoDB を使用したデータ モデリングの詳細については、 「MongoDB アプリケーション モダナイゼーション ガイド」をダウンロードしてください。
ダウンロードには、次のリソースが含まれています。
MongoDB を使用したデータ モデリングの方法論に関するプレゼンテーション
RDBMS データモデルから MongoDB に移行するためのベストプラクティスと考慮事項を説明したホワイトペーパー
MongoDB のスキーマを RDBMS の同等のスキーマで参照
アプリケーション モダナイゼーション スコアカード