DynamoDB設計の
ちょっとした技
株式会社エクストーン 豊田陽一
今日のお話
▰ DynamoDBを設計する上で知っておい
た方がいい小技の紹介
▰ GSI Overloading
▰ Composite Key
▰ Sparse Index
前回のおさらい
▰ DynamoDB
▰ NoSQLデータベース
▰ シングルテーブルでの運用が推奨
▰ アクセスパターンから設計
▰ RDBはデータモデルから設計
▰ パーティションを意識
▰ PK (Partition Key) による分割
GSI Overloading
▰ 異なる用途で同じグローバルセカンダリ
インデックスを利用する
▰ DynamoDBは1テーブルあたり20までのGSIの
み利用可能(一応増やせる)
▰ 同じ検索方法(完全一致、部分一致、範囲指定
等)なら同じGSIを使う
▰ 検索方法が異なる場合は別のGSIを定義する必
要がある
GSI Overloading (cont.)
▰ 下記のインデックスで様々な項目で完
全一致検索が可能
PK SK,GSI1-PK GSI1-SK
Id DataType DataValue
Book_1
BookTitle ゆるキャン△ 12巻
BookAuthor あfろ
BookPublishedAt 2021/4/12
BookPublisherId Publisher_1
Publisher_1
PublisherName 芳文社
PublisherAddress 東京都
Composite Key
▰ ソートキーに複合情報を持たせる
▰ 1つの属性に複数の情報を持たせる
▰ 例)データタイプ・日時等
▰ BookId#2021-05-01
▰ BookIdの前方一致で絞り込み
▰ 後方の日付順にソートされる
▰ 範囲指定も実現可能
Composite Key (cont.)
▰ ソートキーに複合情報を持たせる
▰ 前方一致で絞り込む
PK SK,GSI1-SK GSI1-PK
Id DataType DataValue
Comic_1
ComicTitle ゆるキャン△
ComicBookId#1 Book_1
ComicBookId#2 Book_2
Book_1
BookTitle ゆるキャン△1巻
BookComicId#Book_1 Comic_1
Book_2
BookTitle ゆるキャン△2巻
BookComicId#Book_1 Comic_2
Sparse Index
▰ 無効なデータをインデックスせず、GSI
のインデックスを小さく保つ
▰ 例)ランキングの上位5位
▰ ランキング上位5位のみ、ランキング情報を持つ
項目をPKとして設定する
Sparse Index
▰ PKにランキング情報を保持する
▰ 大半のレコードが値を持たない
PK SK,GSI1-SK GSI1-PK
Id DataType Ranking DataValue
Book_1
BookTitle ゆるキャン△1
BookSales#2021-04 13451
BookRank#2021-04 Rank_1 1
BookSales#2021-05 2376
BookRank#2021-05 13
Book_2
BookTitle ゆるキャン△2
BookSales#2021-05 5123
BookRank#2021-05 Rank_2 2
まとめ
▰ 設計時には常にユースケースから
▰ データの種別は何でもいい
▰ 同じ使い方をするものは同じ属性で突っ込めば
大丈夫
▰ パーティションを意識する
▰ データ量を意識する
▰ 経験とひらめき大事

DynamoDB設計のちょっとした技