埋め込みドキュメントとの 1 対 1 の関係のモデル化
Overview
このページでは、 埋め込みドキュメントを使用して接続されたデータ間の 1 対 1 の関係を記述するデータモデルについて説明します。 接続されたデータを単一のドキュメントに埋め込むと、データを取得するために必要な読み取り操作の数を減らすことができます。 一般に、アプリケーションが 1 回の読み取り操作で必要な情報をすべて受け取れるようにスキーマを構成する必要があります。
埋め込みドキュメント パターン
パターンとアドレスの関係をマッピングする次の例を考えてみましょう。 この例では、あるデータ エンティティを他のデータ エンティティに関連して表示する必要がある場合に、参照よりも埋め込みの利点が示されています。 patron
とaddress
データの 1 対 1 の関係では、 address
はpatron
に属しています。
正規化されたデータモデルでは、 address
ドキュメントにpatron
ドキュメントへの参照が含まれています。
// patron document { _id: "joe", name: "Joe Bookreader" } // address document { patron_id: "joe", // reference to patron document street: "123 Fake Street", city: "Faketon", state: "MA", zip: "12345" }
address
データがname
情報とともに頻繁に取得される場合は、参照を使用すると、アプリケーションは参照を解決するために複数のクエリを発行する必要があります。 より優れたデータモデルは、次のドキュメントのように、 patron
データにaddress
データを埋め込むことです。
{ _id: "joe", name: "Joe Bookreader", address: { street: "123 Fake Street", city: "Faketon", state: "MA", zip: "12345" } }
埋め込みデータ モデルを使用すると、アプリケーションは 1 回のクエリで完全なパッチ情報を検索できます。
サブセット パターン
埋め込みドキュメントパターンに関する潜在的な問題は、アプリケーションに必要のないフィールドを含む大きなドキュメントになる可能性があることです。 こうした不要なデータは、サーバーに余計な負荷を与え、読み取り操作を遅くする可能性があります。 代わりに、サブセット パターンを使用して、1 回のデータベース呼び出しで最も頻繁にアクセスされるデータのサブセットを取得できます。
映画に関する情報を表示するアプリケーションを考えてみましょう。 データベースには、次のスキーマを持つmovie
コレクションが含まれています。
{ "_id": 1, "title": "The Arrival of a Train", "year": 1896, "runtime": 1, "released": ISODate("01-25-1896"), "poster": "http://ia.media-imdb.com/images/M/MV5BMjEyNDk5MDYzOV5BMl5BanBnXkFtZTgwNjIxMTEwMzE@._V1_SX300.jpg", "plot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, ...", "fullplot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, the line dissolves. The doors of the railway-cars open, and people on the platform help passengers to get off.", "lastupdated": ISODate("2015-08-15T10:06:53"), "type": "movie", "directors": [ "Auguste Lumière", "Louis Lumière" ], "imdb": { "rating": 7.3, "votes": 5043, "id": 12 }, "countries": [ "France" ], "genres": [ "Documentary", "Short" ], "tomatoes": { "viewer": { "rating": 3.7, "numReviews": 59 }, "lastUpdated": ISODate("2020-01-09T00:02:53") } }
現在、 movie
コレクションには、 fullplot
や評価情報など、アプリケーションが映画の簡単な概要を表示する必要がないフィールドがいくつか含まれています。 映画データをすべて 1 つのコレクションに保存する代わりに、コレクションを 2 つのコレクションに分割できます。
movie
コレクションには、映画の基本情報が含まれています。 これは、アプリケーションがデフォルトでロードするデータです。// movie collection { "_id": 1, "title": "The Arrival of a Train", "year": 1896, "runtime": 1, "released": ISODate("1896-01-25"), "type": "movie", "directors": [ "Auguste Lumière", "Louis Lumière" ], "countries": [ "France" ], "genres": [ "Documentary", "Short" ], } movie_details
コレクションには、各映画の追加のアクセス頻度の低いデータが含まれています。// movie_details collection { "_id": 156, "movie_id": 1, // reference to the movie collection "poster": "http://ia.media-imdb.com/images/M/MV5BMjEyNDk5MDYzOV5BMl5BanBnXkFtZTgwNjIxMTEwMzE@._V1_SX300.jpg", "plot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, ...", "fullplot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, the line dissolves. The doors of the railway-cars open, and people on the platform help passengers to get off.", "lastupdated": ISODate("2015-08-15T10:06:53"), "imdb": { "rating": 7.3, "votes": 5043, "id": 12 }, "tomatoes": { "viewer": { "rating": 3.7, "numReviews": 59 }, "lastUpdated": ISODate("2020-01-29T00:02:53") } }
この方法により、アプリケーションが最も一般的なリクエストを満たすために必要なデータの数が少なくなるため、読み取りパフォーマンスが向上します。 アプリケーションは、必要に応じて、追加のデータベース呼び出しを実行して、アクセス頻度の低いデータを取得できます。
Tip
データを分割する場所を検討する場合、データの最も頻繁にアクセスする部分は、アプリケーションが最初に読み込むコレクションに含める必要がありGo 。
Tip
以下も参照してください。
サブセット パターンを使用してコレクション間の 1 対多の関係をモデル化する方法については、「埋め込みドキュメントによる 1 対多の関係のモデル化 」を参照してください。
サブセット パターンのトレードオフ
アクセス頻度の高いデータを含む小さいドキュメントを使用すると、 ワーキングセット の全体サイズは縮小されます。 これらが小さいドキュメントは読み取りパフォーマンスが向上し、アプリケーションが使用できるメモリが増えます。
ただし、アプリケーションとデータのロード方法を理解することが重要です。 データを複数のコレクションに不適切に分割した場合、アプリケーションはデータベースへの複数のトリップを実行し、必要なデータをすべて取得するためにJOIN
操作に依存する必要があることがよくあります。
さらに、データを多数の小さなコレクションに分割すると、どのコレクションに保存されているデータを追跡するのが困難になる可能性があるため、データベースのメンテナンスが必要になる可能性があります。