DVAAWSのサービスを使用した開発
大規模なソーシャルネットワーキングサービスを開発中のチームは、Amazon DynamoDBを使用してユーザーの投稿データを管理しています。ベーステーブルは `UserId`(パーティションキー)と `PostId`(ソートキー)で構成されています。開発チームは、特定のカテゴリ(`Category`)に属する投稿を投稿日時(`CreatedTimestamp`)の新しい順で検索できる機能を新しく追加したいと考えています。検索では強い一貫性(Strongly Consistent)は求められていません。既存のテーブル構造を変更せずにこのクエリ処理を実現する、最もコスト効率が良く適切なDynamoDBのインデックス構成はどれですか。
A既存のテーブルにグローバルセカンダリインデックス(GSI)を追加し、パーティションキーを Category、ソートキーを CreatedTimestamp に設定する。
✓ 正解
既存テーブルに対して後から動的に追加でき、ベーステーブルと異なるパーティションキーおよびソートキーを組み合わせたクエリが実行可能なGSIが最適です。
B既存のテーブルにローカルセカンダリインデックス(LSI)を追加し、パーティションキーを UserId、ソートキーを Category に設定する。
ローカルセカンダリインデックス(LSI)はテーブルの新規作成時にしか定義できないため、既存のDynamoDBテーブルへ後から追加することは不可能です。
C既存のテーブルを削除し、UserId をパーティションキー、Category をソートキーとする新しいベーステーブルを作成し直す。
GSIを追加するだけで新しいアクセスパターンに対応できるため、既存のテーブルをわざわざ削除して作り直す必要はありません。
Dインデックスを追加せず、Scan オペレーションに対して FilterExpression を適用し Category と CreatedTimestamp でフィルタリングする。
Scan操作はテーブル全体をフルスキャンしてからフィルタリングするため、データ量が増加した際のレスポンス低下とRCUの無駄遣いが発生します。
解説
既存のDynamoDBテーブルに対して後からインデックスを追加する場合、グローバルセカンダリインデックス(GSI)を使用する必要があります。GSIはベーステーブルと異なるパーティションキーおよびソートキーを自由に組み合わせることができ、本要件のように `Category` で絞り込み `CreatedTimestamp` でソートするような検索パターンに最適です。LSIはテーブル作成時のみしか定義できず、後から追加することはできません。またScan処理はテーブル全体を走査するため大量データ時にレイテンシとReadキャパシティ(RCU)を大量消費し不適切です。
ドメイン別正答率・予想スコアでリアルタイムに実力把握
無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。
無料で演習を始める →