はじめに
DynamoDBはAWSが提供するフルマネージドのNoSQLデータベースであり、リレーショナルデータベースとは異なる設計アプローチが求められます。
この記事では、NoSQLデータベースの設計に慣れていない方向けに、DynamoDBでのテーブル設計の基本的な考え方を解説します。
アクセスパターンに基づく設計
DynamoDBの設計では、リレーショナルデータベースのようにデータの正規化やテーブル間の結合を行わないため、
どのようにデータを読み書きするか(アクセスパターン)をあらかじめ考慮することが非常に重要です。
DynamoDBはクエリを効率的に行えるデザインが推奨されており、スキャン操作(全データ操作)は避けるべきです。
スキャンはすべてのデータを読み込む操作で、コストが高くパフォーマンスも低下します。
そのため、特定のキーに基づいたクエリ操作を優先します。設計時に考慮すべき点は以下です。
- 頻繁に発生するリクエストに対して、どのようなパターンでデータにアクセスするかを検討し、それに合わせて設計する。
- スキャン操作を極力避け、クエリに最適化されたデータ構造を考える。
パーティションキーとソートキーの設計
DynamoDBのテーブルは、パーティションキーとソートキーという2つのキーを使ってデータにアクセスします。
適切なキーの選定がパフォーマンスとスケーラビリティに大きく影響します。
パーティションキー(Partition Key)
DynamoDBのスケーリングのためにデータを分散させるキーです。
このキーの選択が非常に重要で、偏りなくデータが分散されるようにする必要があります。
例えば、特定の日付やステータスをパーティションキーにすると、一部のデータにアクセスが集中してしまう可能性があります。
ソートキー(Sort Key)
同じパーティション内のデータを並べるキーです。
パーティションキー内でデータを順序立てて管理でき、1つのパーティションキーに対して複数のエンティティを格納できます。
例 :blogIdをパーティションキー、postIdをソートキーに設定することで、1つのブログ記事に対する複数の投稿を効率的にクエリできます。
単一テーブル設計
DynamoDBの設計では、複数のエンティティを1つのテーブルに統合する「単一テーブル設計」が一般的です。
これは、データ間の結合が不要で、すべてのデータを一元的に管理するためです。
アクセスパターンに応じたキー設計をすることで、効率的にクエリを行うことが可能です。
- エンティティの統合:例えば、ブログの記事とその著者情報を別々のテーブルに分けず、1つのテーブルに統合します。
- 属性の条件付き取得:必要なデータのみを条件付きで取得し、効率的に処理します。
GSI(グローバルセカンダリインデックス)とLSI(ローカルセカンダリインデックス)の活用
DynamoDBでは、異なるアクセスパターンにも対応できるよう、**GSI(グローバルセカンダリインデックス)やLSI(ローカルセカンダリインデックス)**を活用します。
GSI(グローバルセカンダリインデックス)
パーティションキーとソートキーの組み合わせが異なる場合、GSIを使用することで異なるクエリパターンをサポートします。
例えば、productIdがパーティションキーのテーブルで、カテゴリごとにクエリを行いたい場合、categoryをパーティションキーとするGSIを設定することで可能になります。
LSI(ローカルセカンダリインデックス)
同一パーティションキーで異なるソート順を使いたい場合、LSIが役立ちます。
例えば、日付順や価格順にデータを取得する場合に利用します。
データの正規化と非正規化
リレーショナルデータベースの設計ではデータを正規化して、テーブル間の結合を使いますが、DynamoDBでは逆にデータの非正規化が推奨されます。
これにより、必要な情報を1つのエンティティにまとめ、効率的にクエリを行えます。
- 正規化の例:リレーショナルデータベースでは、ブログ記事とタグを別々のテーブルに分け、外部キーでリンクしますが、DynamoDBでは、記事データにタグ情報も含めて格納します。
- 非正規化の利点:1回のクエリで必要なデータをすべて取得でき、複数のテーブルを結合する必要がないため、パフォーマンスが向上します。
具体的な設計例
- ブログ記事管理の設計例
- パーティションキー:blogId
- ソートキー:postId
- GSI:author(著者別に記事を検索できるようにする)
- アクセスパターン:postIdでソートして最新の記事を取得、著者別に記事をフィルタリング。
- 商品管理システムの設計例
- パーティションキー:productId
- ソートキー:category
- GSI:priceRange(価格帯別に商品を検索する)
- アクセスパターン:カテゴリごとの商品検索や、価格帯、在庫状況でのフィルタリングが可能。
パーティションキー選定のポイント
適切なパーティションキーを選定することは、スケーラビリティやパフォーマンスを維持するために非常に重要です。以下の点に注意します。
偏りのないキーを選ぶ
パーティションキーが偏ると、一部のパーティションにアクセスが集中し、ホットパーティション(負荷集中)の問題が発生する可能性があります。
ホットパーティションの回避
例えば、日付やステータスをキーにすると、特定の時間や状態にデータが集中しやすいため、別の属性を検討する必要があります。
DynamoDBの設計においては、リレーショナルデータベースとは異なるアプローチが必要です。アクセスパターンを考慮した設計と、パフォーマンスを最大化するキーの選定が重要なポイントとなります。このガイドを参考に、効率的なDynamoDBの設計を進めてください。