実はRDBよりもカッチリ設計する必要がある。 → ウォーターフォール的
DynamoDBのQueryは条件を最大2つしか設定できない(Primary Key + Sort Key)ので、追加の要件に弱い。
RDBは正規化していればあとから要件が増えても対応できる。
鉄則
テーブル数はなるべく少なくする。(理想はシングルテーブル)
- DynamoDBはテーブル単位課金なのでコストメリットがある
- O11yの観点でも、単一テーブルへの監視設定で済む方が楽
手順
- データモデリング。ER図を作る。
- ユースケース(
get◯◯by△△のようなクエリ条件)をリスト化する - スキーマ設計する
- ユースケース表に対応するクエリを書き出す
- 対象が現実的なデータ量であれば、ScanやFilterを使っても良い
- 満たせていなければ3からやり直し
テクニック
- GSIオーバローディング
- PKとSKの属性に「特定の種類の項目を入れない」設計方法
- 極端な例、PKを「PK」という項目名にしてしまう
- ここにはUserIDが入ったり、BookIDが入ったり、とにかくエンティティのPKが入るという
- GSIを複数設定しなくても、ひとつの属性でエンティティごとの検索ができるメリットがある
- 複合ソートキー
- 1つのソートキーに2種類以上の値を入れる
- 例えば、MessageID#created_at
- こうすることで、ソートキーを検索条件に使いつつ末尾の作成日時でソートされてクエリ結果を返せる
- begin_with句で前方一致がかけられるからこそなせる技