Amazon DynamoDB のテーブル設計パターン - シングルテーブル設計と GSI の活用

DynamoDB のパーティションキー設計、シングルテーブルデザイン、GSI によるアクセスパターンの実現を解説します。

DynamoDB の概要

DynamoDB はミリ秒レベルのレイテンシを提供するフルマネージド NoSQL データベースです。RDS と異なりスキーマレスで、パーティションキーとソートキーの組み合わせでデータにアクセスします。サーバーレスアーキテクチャでは、Lambda や API Gateway と組み合わせて使えます。オンデマンドとプロビジョンドの 2 つのキャパシティモードを提供します。DynamoDB はパーティション単位で自動的にスケールし、1 つのパーティションは最大 10 GB のデータと秒間 3,000 RCU / 1,000 WCU を処理します。テーブルサイズに上限はありません。

テーブル設計

パーティションキーはデータの分散に直結するため、カーディナリティの高い属性 (ユーザー ID、注文 ID) を選択します。シングルテーブルデザインでは PK に「USER#123」「ORDER#456」のようなプレフィックスを付与し、SK でエンティティの種類とリレーションを表現します。Query で PK を指定すると、ユーザー情報と注文履歴を 1 回のクエリで取得できます。GSI は異なるアクセスパターン (メールアドレスでユーザーを検索、日付範囲で注文を検索) に対応し、テーブルあたり最大 20 個作成できます。パーティションキーに日付やステータスなどカーディナリティの低い値を選ぶと、特定パーティションにアクセスが集中し、ホットパーティションになることがあります。この場合、キーにサフィックス (ランダム値やタイムスタンプの一部) を付加してリクエストを分散させます。

GSI と単一テーブル設計

グローバルセカンダリインデックス (GSI) はメインテーブルとは異なるパーティションキーとソートキーでクエリを実行します。単一テーブル設計では、複数のエンティティ (ユーザー、注文、商品) を 1 つのテーブルに格納し、 GSI のオーバーロードで多様なアクセスパターンに対応します。 PK に 'USER#123'、 SK に 'ORDER#456' のようなプレフィックスを付与し、 begins_with 条件でエンティティを絞り込みます。スパースインデックスは特定の属性を持つアイテムのみをインデックスに含めるため、インデックスのサイズとコストを抑えられます。

設計のベストプラクティスと落とし穴

単一テーブル設計は、すべてのケースに適するわけではありません。エンティティ間のリレーションが複雑で、アクセスパターンが頻繁に変化するアプリケーションでは、テーブルを分離した方が運用しやすい場合があります。GSI の書き込みスロットリングはメインテーブルに波及するため、GSI のキャパシティがメインテーブルの書き込み量に追従できるよう設計します。BatchWriteItem では一部の書き込みだけが成功し、残りが処理されないことがあるため、未処理アイテムのリトライロジックを実装します。DynamoDB Streams と Lambda を組み合わせたイベント駆動パターンでは、Lambda の並列実行の数がパーティション数に依存します。Adaptive Capacity は自動的にホットパーティションのスループットを引き上げますが、テーブル全体のプロビジョンドキャパシティを超えることはできません。

RDS との使い分け

DynamoDB はキーベースの読み書きに特化しており、単純なキールックアップや範囲クエリを低いレイテンシで処理します。一方、複雑な JOIN や集計クエリ、ACID トランザクションが中心のワークロードには、RDS (Aurora / PostgreSQL) を使う方法があります。DynamoDB のトランザクション (TransactWriteItems / TransactGetItems) は最大 100 アイテムまでの制限があり、同じ AWS アカウントと同じリージョンであれば複数のテーブルのアイテムをまとめて扱えます。ユーザープロファイルやセッションストア、リアルタイムランキング、IoT デバイスデータの蓄積などに DynamoDB を使います。レポーティングや分析クエリが主体のワークロードでは、DynamoDB から S3 へエクスポートし Athena で分析する構成か、DynamoDB Streams 経由で OpenSearch に同期する構成をとります。

DynamoDB の料金最適化

DynamoDB のオンデマンドモードは、読み取り (RRU) と書き込み (WRU) のリクエストの数に応じた従量課金です。プロビジョンドモードは WCU/RCU の時間課金で、安定したワークロードでは Auto Scaling と組み合わせてキャパシティを負荷に合わせられます。リザーブドキャパシティでは割引が適用されます。GSI は独自のキャパシティを消費するため、不要な GSI を削除し、プロジェクション属性を絞ると、ストレージコストを抑えられます。TTL で期限切れデータを自動削除し、ストレージコストを抑えます。

まとめ

DynamoDB は、パーティションキーとソートキーの設計でデータにアクセスする NoSQL データベースです。GSI のオーバーロードと単一テーブル設計で多様なアクセスパターンに対応し、スパースインデックスでインデックスのコストを抑えます。オンデマンドとプロビジョンドモードの使い分けと TTL によるデータ自動削除で、コストを管理します。

参考資料 (AWS 公式)

本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。

本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。

共有する