概要
DynamoDB のテーブル設計についてベストプラクティスが公式で紹介されているがわかりづらいので解釈入れてメモ。
なお、以下ではパーティションキーをPK、ソートキーをSKと記載する。
ソートキーでバージョンコントロール
SK で履歴が判るようにする。
参考: ソートキーを使用してデータを整理するためのベストプラクティス - Amazon DynamoDB
スパースインデックス
値が欠けているレコードは除外してインデックスを作れる。これがスパースインデックス。
関係ないレコードを除外できるので高速なクエリが可能。
参考: スパースインデックスの利用 - Amazon DynamoDB
上記テーブルで Award
のカラムを PK にして GSI を作る。
集計値を同じテーブル内に
同じテーブルで管理することでコンセプトをテーブル単位に管理でき、プロビジョニングしている環境に相乗りできる。
参考: マテリアライズされた集計クエリでグローバルセカンダリインデックスを使用する - Amazon DynamoDB
GSI の多目的利用
Sort Key を用途名にすることで、1つの GSI を多目的に利用できる。
(GSI は 20 しか張れないが、この技でそれを超えた用途を適えることができる。)
参考: グローバルセカンダリインデックスの多重定義 - Amazon DynamoDB
※以下、Partition Key を PK, Sort Key を SK と記す。
GSI の PK として「Sort Key」を、GSI の SK として「Attribute 1」(Data) を指定。
-
PK="Employee_Name" and SK=ユーザ名
⇒ 特定ユーザに紐つくデータ抽出 -
PK="Warehouse_01"
(Warehouse ID) ⇒ 特定倉庫で働く全ユーザ名、employee ID 抽出 -
PK="HR_confidential" and SK="2008-11-08"
(勤務開始日=Start) ⇒ 指定期間に雇用した employee ID 取得
シャーディング
ランダム値を PK にすることで分散させて高速に目的のレコードを抽出。
参考: 選択テーブルクエリでグローバルセカンダリインデックス書き込みシャーディングを使用する - Amazon DynamoDB
0~N のランダム値を PK に持つ GSI を作り、0~N を並列でデータ取得する。
CRITICAL な特定日付範囲の情報を高速に取得可能。
時系列データ
日付ごとにテーブルを分け、頻繁にアクセスする当日のデータに集中できるようにする。
古いデータはもはや書き込まれないので、プロビジョニングされた書き込み容量を小さい値 (1 WCU など) に減らすことが可能。削除することも可能。
参考: DynamoDB で時系列データを処理するベストプラクティス。 - Amazon DynamoDB
多対多
GSIを使うことで多対多は簡単にできる。
参考: 多対多の関係を管理するためのベストプラクティス - Amazon DynamoDB