DynamoDB で後から直せるのはインデックス、直せないのはキー(GSI は後付け可、LSI は作成時のみ)
DynamoDB のテーブル設計でやり直しが効く部分と効かない部分を分けておくと、最初に悩むべき所がはっきりする。
直せるもの・直せないもの
| 対象 | 作成後に変更・追加できるか | 備考 |
|---|---|---|
| テーブルのパーティションキー / ソートキー | できない | 変えるには新テーブルを作ってデータを移す |
| GSI(グローバルセカンダリインデックス) | 後から追加・削除できる | 別のパーティションキーで作れる。読み取りは結果整合のみ |
| LSI(ローカルセカンダリインデックス) | テーブル作成時にしか作れない(後から削除もできない) | パーティションキーはテーブルと同じで、ソートキーだけ別にする。強整合の読み取りが使える |
設計時の判断
- パーティションキーとソートキーは最初に決めきる。主要なアクセスパターン(何で引くか・何で並べるか)を書き出してから作る
- 「同じパーティションキーで、別の並び順でも引きたい」かつ「強整合が要る」なら、LSI を 作成時に 入れておく
- それ以外の追加のアクセスパターンは、あとで GSI を足して対応する前提でよい
GSI の追加は既存テーブルに対して実行できる(バックフィルが走る)。
sh
aws dynamodb update-table \
--table-name Orders \
--attribute-definitions AttributeName=customerId,AttributeType=S \
--global-secondary-index-updates \
'[{"Create":{"IndexName":"byCustomer","KeySchema":[{"AttributeName":"customerId","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}}]'(オンデマンドではなくプロビジョンドモードのテーブルなら ProvisionedThroughput も指定する)
注意点
- LSI を付けたテーブルは、同じパーティションキーの項目(アイテムコレクション)が合計 10GB までという制限がかかる。LSI は「とりあえず付ける」ものではない
- LSI は 1 テーブル 5 個まで。GSI の上限は既定で 20 個(引き上げ申請可)
- キーを変えたくなったら、新テーブルを作り、S3 へのエクスポート / インポートや DynamoDB Streams で移行する
- 容量の見積もりは DynamoDB: RCU は「4KB 単位に切り上げ」で数える/DAX を入れる前に強整合が要るか確かめる を参照