重複データの処理
単一のドキュメントに関連データを埋め込む場合、2 つのコレクション間でデータを複製できます。データを重複させることにより、アプリケーションは、モデル内のエンティティを論理的に分離しながら、1 つのクエリで複数のエンティティについての関連情報をクエリできます。
このタスクについて
データを重複させることに関する懸念事項の 1 つは、ストレージ コストの増加です。 ただし、アクセス パターンを最適化する利点は通常、ストレージによる潜在的なコストの増加を超える。
データを複製する前に、以下の要素を考慮してください。
重複したデータをどのくらいの頻度でアップデートする必要があるか。 重複したデータを頻繁に更新すると、重いワークロードとパフォーマンスの問題が発生する可能性があります。 ただし、頻度の低い更新を処理するために必要な追加ロジックは、読み取り操作で結合(ルックアップ)を実行するよりもコストが低くなります。
データが重複している場合の読み取りのパフォーマンス上の利点。 データを重複させることで、複数のコレクションにわたって結合を実行する必要がなくなるため、アプリケーションのパフォーマンスが向上します。
例: E Commerge スキーマでのデータの重複
次の例は、データアクセスとパフォーマンスを向上させるために、eコマース アプリケーション スキーマでデータを複製する方法を示しています。
手順
データベースにデータを入力する
eCommerce
データベースに次のコレクションを作成します。
コレクション名 | 説明 | サンプルドキュメント | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 名前、メール、電話番号などのカスタマー情報を保存します。 |
| ||||||||||||||||||||||||||
| 価格、サイズ、素材などの製品情報を保存します。 |
| ||||||||||||||||||||||||||
| 日付や合計金額などの注文情報を保存します。 Documents in the |
|
products
コレクションの次のプロパティはorders
コレクションに重複しています。
productId
product
price
size
データを重複させることの利点
アプリケーションが注文情報を表示すると、対応する注文の行項目が表示されます。 注文情報と製品情報が別々のコレクションに保存されている場合、2 つのコレクションのデータを結合するには、アプリケーションは $lookup
を実行する必要があります。 ルックアップ操作は、多くの場合、コストとパフォーマンスが低下します。
orders
コレクションに行項目のみを埋め込むのではなく、製品情報を複製する理由は、アプリケーションが注文を表示するときにのみ製品情報のサブセットのみを必要とするためです。 必須 フィールドのみを埋め込むことで、アプリケーションは追加の製品の詳細を保存することができ、 orders
コレクションに不要な肥大化を引き起こすことはありません。
例: 製品レビューの重複データ
次の例では、 サブセット パターンを使用して、オンライン ストアのアクセス パターンを最適化します。
たとえば、ユーザーが製品を表示すると、アプリケーションに製品の情報と最新の 5 件のレビューが表示されるアプリケーションを考えてみましょう。 レビューは、 products
コレクションとreviews
コレクションの両方に保存されます。
新しいレビューが書き込まれると、次の書き込みが行われます。
手順
データベースにデータを入力する
productsAndReviews
データベースに次のコレクションを作成します。
コレクション名 | 説明 | サンプルドキュメント | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 製品情報を保存します。 |
| |||||||||||||||||||||
| 製品のすべてのレビュー(最近のレビューのみ)を保存します。 |
|
データを重複させることの利点
アプリケーションは、表示する必要があるすべての情報を返すために、データベースを 1 回呼び出すだけで済みます。 データが完全に別々のコレクションに保存されている場合、アプリケーションはproducts
reviews
コレクションと コレクションのデータを結合する必要があるため、パフォーマンスの問題が発生する可能性があります。
レビューはほとんど更新されないため、重複データの保存コストは低く、コレクション間でデータの一貫性を保つことは困難ではありません。
詳細
重複データの整合性を保つ方法については、「データの整合性 」を参照してください。