無限ノック › DVA 練習問題一覧 › 問題
DVAAWSのサービスを使用した開発

注文管理アプリケーションがDynamoDBテーブルを使用しています。テーブルの主キーは `customerId`(パーティションキー)と `orderId`(ソートキー)です。このテーブルはすでに本番環境で稼働中であり、数百万件のレコードが格納されています。新たに「特定の顧客の注文を `orderDate` の降順で効率的に取得する」要件が追加されました。この要件を最も適切に実装する方法はどれですか?

A
`customerId` をパーティションキー、`orderDate` をソートキーとするローカルセカンダリインデックス(LSI)を既存テーブルに追加し、ScanIndexForward=false で降順クエリを実行する
ローカルセカンダリインデックス(LSI)はDynamoDBテーブルの作成時にのみ定義できる制約があります。本番稼働中の既存テーブルへの後付け追加はAWSでサポートされていないため、この設計要件を実現することはできません。
B
`customerId` をパーティションキー、`orderDate` をソートキーとするグローバルセカンダリインデックス(GSI)を既存テーブルに追加し、ScanIndexForward=false で降順クエリを実行する
✓ 正解
グローバルセカンダリインデックス(GSI)は既存テーブルにいつでも追加でき、`customerId`をPK・`orderDate`をSKに設定することで、ScanIndexForward=falseを指定した Queryで特定顧客の注文をorderDate降順で効率的に取得できます。
C
ベーステーブルに対して Query オペレーションを実行してすべての注文データを一括取得し、アプリケーションサーバー上で `orderDate` の降順ソートロジックを実装して返す
Queryオペレーションはベーステーブルのソートキー(`orderId`)順にデータを返します。`orderDate`降順取得には全件取得後にアプリ側でソートが必要となり、数百万件規模のデータでは応答時間とコストが大幅に増加します。
D
ベーステーブルに対して Scan オペレーションに FilterExpression を組み合わせて `customerId` で絞り込みを行い、取得した結果を `orderDate` の降順でソートして返す
Scanオペレーションはテーブル全件を読み取った後にFilterExpressionで絞り込む方式のため、数百万件のレコードが存在するテーブルでは消費RCUと応答時間が大幅に増大し、本番ワークロードには不適切です。

解説

GSIは既存テーブルにいつでも追加でき、`customerId`をパーティションキー・`orderDate`をソートキーに設定することで、ScanIndexForward=falseで特定顧客の注文をorderDate降順で効率的に取得できます。 選択肢AのLSIはテーブル作成時にのみ定義できる制約があり、稼働中テーブルへの後付け追加は不可能。 選択肢CのQueryはベーステーブルのソートキー(orderId)順にしかソートできず、全件取得後のアプリ側ソートは大量データで非効率。 選択肢DのScanはテーブル全件を読み取るためRCU消費が大きく、本番ワークロードに不適切。

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
← DVA の問題一覧に戻る