同じコンテナー内の集計を非正規化する

完了

新しいモデルを完成させる前に最後に確認する操作は、販売注文数の上位 10 件の顧客のクエリを実行することです。 現在のモデルでは、まず各顧客でグループ分けして集計し、顧客コンテナー内で販売注文を合計します。 次に降順で並べ替え、上位 10 件の結果を取得します。 顧客と販売注文は同じコンテナーに格納されていますが、この種のクエリは現状では実行できません。

ここでのソリューションは、集計値を顧客ドキュメントの新しいプロパティ salesOrderCount で非正規化することです。 次の図に示すようにクエリでこのプロパティを使用することで、必要なデータを取得することができます。

上位 10 人の顧客を取得するための新しい販売注文数プロパティ、顧客コンテナー、クエリを示す図。

次は、顧客が新しい販売注文を作成し、顧客コンテナーに新しい販売注文が挿入されるたびに、顧客ドキュメントを更新して、salesOrderCount プロパティを 1 ずつインクリメントする方法が必要です。 これを行うには、トランザクションが必要です。 データが同じ論理パーティション内に存在する場合は、Azure Cosmos DB でトランザクションがサポートされます。

顧客と販売注文は同じ論理パーティションに存在するため、トランザクションで新しい販売注文を挿入して、顧客ドキュメントを更新できます。 Azure Cosmos DB でトランザクションを実装するには、ストアド プロシージャを使用するか、.NET SDK と Java SDK の両方で使用できる トランザクション バッチと呼ばれる機能を使用する方法の 2 つがあります。

新しい販売注文が作成されると、顧客ドキュメントが新しい販売注文の合計で更新されることを示す顧客コンテナーの図。