ある小売チェーンが、各店舗の在庫データ(品番、数量、最終更新日時)を Azure Table Storage で管理している。「品番 ABC123 の全店舗在庫を取得するクエリ」と「店舗 ID S001 の全品目在庫を取得するクエリ」をどちらも効率的に実行できるキー設計として最も適切なものはどれか。
- A. パーティションキー: 品番+店舗 ID の連結、ロウキー: タイムスタンプ — どちらのクエリも非効率になる
- B. パーティションキー: 店舗 ID、ロウキー: 品番 — 店舗での取得は効率的だが品番での取得はフルスキャンになる
- C. パーティションキー: 品番、ロウキー: 店舗 ID のエントリと、パーティションキー: 店舗 ID、ロウキー: 品番のエントリを両方保持する(重複格納)
- D. パーティションキー: 品番、ロウキー: 店舗 ID — 品番での取得は効率的だが店舗での取得はフルスキャンになる
解答と解説を見る
正解: C
Azure Table Storage は単一のパーティションキー・ロウキー構造のみでインデックスが決まるため、設計上どちらのクエリも効率的にカバーする単一キー設計は存在しない。この制限に対処する標準パターンは「同じデータを異なるキー設計で 2 つのテーブルまたはエンティティとして重複格納する」アプローチである。書き込みコストは増えるが、両方のクエリパターンを効率的なパーティションクエリで実行できる。選択肢 D は品番クエリには効率的だが店舗クエリはクロスパーティションになり全スキャンになる。選択肢 B は逆に店舗クエリには効率的だが品番クエリが全スキャンになる。選択肢 A の連結キーはどちらのクエリも効率的に実行できない最悪の設計である。