外側のパターンでデータをグループ化する
項目一覧
コレクションにほぼ同じサイズと形状のドキュメントが保存されている場合、大幅に異なるドキュメント(アウトバウンド)は、一般的なクエリのパフォーマンスの問題を発生させる可能性があります。
配列フィールドを保存するコレクションを検討します。 ドキュメントにコレクション内の他のドキュメントよりも多くの配列要素が含まれている場合は、スキーマ内でそのドキュメントを異なる方法で処理する必要がある場合があります。
外側のパターンを使用して、期待される形状と一致しないドキュメントをコレクションの残りの部分から分離します。 スキーマは引き続き同じデータすべてを保持しますが、一般的なクエリは単一の大きなドキュメントの影響を受けません。
始める前に
アウトバウンドを処理するようにスキーマを変更する前に、アウトバウンド パターンの長所と懸念事項を検討してください。
長所
外側のパターンにより、よく実行されるクエリのパフォーマンスが向上します。 一般的なドキュメントを返すクエリでは、アウトバウンド 大規模なドキュメントも返す必要はありません。
外側のパターンは、アプリケーション内のエッジケースも処理します。 たとえば、アプリケーションが通常、配列から50の結果を表示する場合、ユーザー エクスペリエンスを中断するような2 、 000の結果を含むドキュメントはありません。
短所
外側のパターンでは、更新を処理するためにより複雑なロジックが必要になります。 データの更新が頻繁に必要な場合は、他のスキーマ設計パターンを検討してください。 詳しくは、「 Atlas のアップデート 」を参照してください。
このタスクについて
書籍の売上を追跡するスキーマを考えてみましょう。 コレクション内の通常のドキュメントは次のようになります。
db.sales.insertOne( { "_id": 1, "title": "Invisible Cities", "year": 1972, "author": "Italo Calvino", "customers_purchased": [ "user00", "user01", "user02" ] } )
customers_purchased
配列は無制限であるため、書籍を購入する顧客が多いほど配列は大きくなります。 ほとんどのドキュメントでは、店舗では特定の書籍の数倍の売上が予想されているため、問題にはなりません。
新しい人気の書籍が大量に購入されるとします。 現在のスキーマ設計ではドキュメントが肥大化し、パフォーマンスに悪影響が生じます。 この問題に対処するには、通常の販売額がないドキュメントに対して 外側のパターン を実装します。
手順
外側のドキュメントにインジケーターを追加する
50を超える売上のある書籍の場合は、 has_extras
という新しいドキュメント フィールドを追加し、値をtrue
に設定します。 このフィールドは、別の コレクションに保存されている売上が、さらにあることを示します。
db.sales.insertOne( { "_id": 2, "title": "The Wooden Amulet", "year": 2023, "author": "Lesley Moreno", "customers_purchased": [ "user00", "user01", "user02", ... "user49" ], "has_extras": true } )
結果
The outlier pattern prevents atypical documents from impacting query performance. 結果として得られるスキーマは、販売の完全なリストを維持しながら、 コレクション内の大きなドキュメントを回避します。
書籍とその書籍を購入したすべてのユーザーに関する情報を表示するアプリケーション ページを考えてみましょう。 外側のパターンを実装すると、ページにはほとんどの書籍(一般的なドキュメント)の情報がすばやく表示されます。
一般的な書籍(アウトバウンド)の場合、アプリケーションはbook_id
のextra_sales
コレクションで追加のクエリを実行します。 このクエリのパフォーマンスを向上させるには、 book_id
フィールドにインデックスを作成します。
アウトバウンドの更新
対象外のドキュメントのアップデートは、通常のドキュメントとは異なる方法で処理する必要があります。 更新を実行するために使用するロジックは、スキーマの設計によって異なります。
前述のスキーマのアウトバウンドのアップデートを実行するには、次のアプリケーション ロジックを実装します。
更新対象のドキュメントで、
has_extras
がtrue
に設定されているかどうかを確認します。has_extras
が欠落している場合、またはfalse
の場合は、新しい購入をsales
コレクションに追加します。結果の
customers_purchased
配列に50を超える要素が含まれている場合は、has_extras
をtrue
に設定します。
has_extras
がtrue
の場合、対応するbook_id
のsales_extras
コレクションに新しい購入を追加します。