はじめてのDynamoDB
スキーマ設計
株式会社エクストーン 豊田陽一
今日のお話
▰ DynamoDBのスキーマ設計の話
▰ AppSyncから自動生成されたDynamoDBのス
キーマがなんか使いづらい…
▰ AWSが想定するDynamoDBのスキーマ設計と
は何
▰ https:/
/docs.aws.amazon.com/ja_jp/ama
zondynamodb/latest/developerguide/best
-practices.html
設計時の考え方の違い
▰ 一般的なRDBMSの場合
▰ データモデリング
▰ アクセスはSQLによって柔軟に
▰ 「何があるか」が大事
▰ NoSQLの場合
▰ アクセスパターン
▰ インデックス設計最重要
▰ 「どう使われるか」が大事
アクセスパターンが大事な理由
▰ DBの特徴の差
▰ DynamoDBの特徴
▰ 特定の問い合わせに対するレスポンスが早い
▰ それ以外はとても遅い、あるいは出来ない
▰ RDBMSの特徴
▰ あらゆる問い合わせを柔軟に実行可能
▰ どの問い合わせもそこそこ遅い
▰ RDBMSの「そこそこ遅い」に耐えられない場合
NoSQLを選択する
アクセスパターンが大事な理由
▰ 分散DBの特徴を理解する
▰ キーからデータの取得は高速
▰ 少ないデータから検索した方が早い
▰ 条件に応じて複数件のデータを返す場合、それ
らのデータは1箇所にあると早い
▰ クエリが分散した方が早い
パーティショニング
▰ データを複数のパーティションに分割し
て保持する
▰ パーティションキーによって分割
▰ 同じパーティションキーを持つデータのアクセス
が集中しないように設計する
パーティションキーの設計
▰ パーティションキーの均一性
▰ パーティションにデータが偏らないように設計す
る
▰ パーティションキーが同じものは必ず同じパー
ティションに保持される
▰ ユーザーID (均一性○)
▰ データのステータス情報(均一性
×)
▰ 日付情報(均一性△)
ソートキーの設計
▰ パーティション内で物理的な配置順を
指定するためのキー
▰ ソートキーを指定して問い合わせることで、デー
タのフィルタリングが可能
▰ パーティションキーとセットでユニークキーにな
るように設計する
ここまでのまとめ
▰ キーについて
▰ パーティションキー
▰ パーティションを分けるためのキー。アクセスが
同一パーティションに集中しないように注意
▰ ソートキー
▰ パーティション内での並び順を決めるための
キー。検索に使える
▰ プライマリキー
▰ パーティションキー+ソートキーの複合
セカンダリインデックス
▰ 追加のインデックス
▰ グローバルセカンダリインデックス
▰ 既存のテーブルに新しいパーティションキーと
ソートキーを追加する
▰ ローカルセカンダリインデックス
▰ 既存のパーティションを利用し、ソートキーを追加
する
▰ セカンダリインデックスの数が増えるとコストが
増えるので、極力最小限に
GSIオーバーロード
▰ 1つのグローバルセカンダリインデック
スを複数の検索用途に利用
▰ RDBMSのように、カラム毎にインデックスを作
らないようにする
テーブルの設計例
▰ RDBMSの場合
▰ 本の情報を持つテーブル
▰ 本用のテーブルを作成し、1エンティティ毎に1レ
コードで管理する
book_id title author published_at
1 ゆるキャン△ 12巻 あfろ 2021/4/12
2 チェンソーマン11 藤本タツキ 2021/3/4
テーブルの設計例 (cont.)
▰ DynamoDBの場合
▰ 本の情報を持つテーブル
▰ 各属性毎にレコードを持つ
PK,GSI1-SK SK GSI1-PK
Id DataType DataValue
Book_1 BookTitle ゆるキャン△ 12巻
Book_1 BookAuthor あfろ
Book_1 BookPublishedAt 2021/4/12
Book_2 BookTitle チェンソーマン11
Book_2 BookAuthor 藤本タツキ
Book_2 BookPublishedAt 2021/3/4
検索
▰ キーによる検索
▰ パーティションキー
▰ 完全一致のみ
▰ ソートキー
▰ オプション
▰ 範囲による検索
▰ 文字列の前方一致による検索
例: 日付の範囲による検索
▰ RDBMSの場合
▰ 日付の条件を組み込んだクエリを発行する
▰ 検索時に考慮すればいいので、どのように検索さ
れるかを設計時に考えなくてもいい
▰ DynamoDBの場合
▰ 日付で検索できるようにインデックスを正しく定
義する必要がある
例: 日付の範囲による検索 (cont.)
▰ 日付をソートキーとして保持
▰ 範囲検索用のGSIを定義する必要がある
PK,GSI1-SK SK, GSI2-PK GSI1-PK GSI2-SK
Id DataType DataValue RangeValue IdAttribute
Book_1 BookTitle ゆるキャン△ 12巻
Book_1 BookAuthor あfろ
Book_1 BookPublishedAt 2021/4/12 1618185600 Book_1
Book_2 BookTitle チェンソーマン11
Book_2 BookAuthor 藤本タツキ
Book_2 BookPublishedAt 2021/3/4 1614816000 Book_2
例: 日付の範囲による検索 (cont.)
▰ 日付ソート用のインデックス
▰ データが増えるとパーティションサイズが大きく
なる
GSI2-PK GSI2-SK Attributes
DataType RangeValue IdAttribute
BookPublishedAt 1618185600 Book_1
BookPublishedAt 1614816000 Book_2
例: 日付の範囲による検索 (cont.)
▰ ex) 出版日から書籍を取得
▰ GSI2から
▰ QUERY(PK: ’BookPublishedAt’, SK < :date)
▰ Primary Indexから
▰ QUERY(PK: :book_id)
▰ GSI2のQUERYの結果から取得
例: 日付の範囲による検索 (cont.)
▰ 範囲検索が必要な項目に関しては同じ
インデックスを利用可能
▰ ex) 日別の本の売り上げ数の管理を追加
GSI2-PK GSI2-SK Attributes
DataType RangeValue IdAttribute
BookPublishedAt 1618185600 Book_1
BookPublishedAt 1614816000 Book_2
BookSales_Daily_20210416 36 Book_1
BookSales_Daily_20210416 62 Book_2
まとめ
▰ DynamoDBのスキーマ設計のお話
▰ パーティションキーとソートキー
▰ ユースケースから設計する
▰ モデルから設計するRDBMSとの違い
▰ インデックスの共有
▰ 1エンティティのデータを複数レコードで持つ
▰ 同じ使われ方をされる項目は同じカラムでまとめ
ることで、GSIの多重化を行う

はじめてのDynamoDBスキーマ設計