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

完了

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

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

Diagram showing a new sales order count property, customer container, and query for getting top 10 customers.

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

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

Diagram of a customer container showing that when a new sales order is created, the customer document is updated with the new sales order total.