Lambda とセットで、DynamoDB をよく使うようになったですが、インデックス周りがいつもあやふやになるので、備忘録の作成。
DVA は取ってないから、この辺りは苦手です。
取るならちゃんと覚えておかないと。
DynamoDB
NoSQL
KeyValue もしくは KeyObject 形式の NoSQL に分類される DB 。
スキーマーレス なので、作成時にはプライマリーキーだけ指定すれば問題なし。
データ追加時に、属性( Attribute )は増やせる。
属性とは、RDS でいうカラムに相当するもの。
プライマリキー
作成時にプライマリキーの指定が必要。
プライマリキーには、以下の2種類がある。
セカンダリインデックス
プライマリキー以外で、絞り込みを実行したい場合に利用する。
セカンダリインデックスには、以下の2種類がある。
- ローカルセカンダリインデックス (LSI)
- テーブル作成時にのみ設定できる
- 最大5個まで
- 後で追加できないので、 予め予約領域として作っておくテクニック もある
- 最大5個まで
- ソートキーがある場合のみ設定可能
- ソートキーを増やしていくイメージ
- パーティションキーと組み合わせて利用する
- テーブル作成時にのみ設定できる
- グローバルセカンダリインデックス (GSI)
- パーティションキーとソートキーを任意の属性に設定するイメージ
- ただし属性値はテーブル内で一意である必要はない
- 内部的には新しいテーブルができるようなもの
- 遅くなる、課金が増えるなど注意が必要
- パーティションキーとソートキーを任意の属性に設定するイメージ
まとめ
インデックスを多用する作りになる場合は、そもそも DynamoDB の要件にあってない可能性があるので注意したい。
RDS でいうレコードに相当するアイテム( Item )単位で、属性( Attribute )を変更できるのも特徴。
この辺りのテクニックは、re:Invent 2019 の「DynamoDBデータモデリング (CMY304) 」が参考になったので、クラスメソッドさんの レポート がとても役に立ちます。