AWS DynamoDB 設計例
アプリのイベント履歴管理
パーティションキー: User ID
ソートキー: Time Stamp
table:table
User TimeStamp Opponent Result
Alice 2014-07-11 12:21:20 Bob Lost
Alice 2014-07-11 12:42:20 Bob Won
Alice 2014-07-14 09:48:20 Bob Won
ポイント
ユーザ毎に TimeStamp で範囲指定してクエリできる
応用
Amazon EMR:
読み出し
Filter する
Amazon Redshift:
読み込み
Time Based Partition Tables
最新テーブルに書き込み、古いテーブルは書き込まずたまに読み込む
古いテーブルはスループットを抑えることができる
古いログはアーカイブしてRedsihtやS3に書き出し、drop tableで削除できる
ソーシャル画像共有アプリ
table:ユーザ情報テーブル
User(パーティションキー) Nicknames
table:友達リストテーブル
User(パーティションキー) Friend(ソートキー)
Bob Alice
Alice Bob
Alice Carol
Alice Dan
table:投稿画像テーブル
USer(パーティションキー) Image(ソートキー) Date Link
Bob ae4c 2013-10-01 s3://...
Bob cf2e2 2013-09-05 s3://...
Bob f93bae 2013-10-08 s3://...
Alice ca61a 2013-09-12 s3://...
table:タグテーブル
Image User
ar4c Alice
ard4c Bob
f93bar Alice
f93bar Bob
ポイント
あるユーザの友達一覧を取得
Query (Table = Friends, Hash = Alice, Range = *)
BatchGetItem(Bob, Carol, Dan)
あるユーザの投稿画像一覧を取得
Query (Table = Images, Hash = Bob, Range = *)
ある時刻以降の画像を取得したかったら...?
ある画像にタグ付け
PutItem (Table = ImageTags, Hash = f93bar, Range = Alice)
ある画像にタグづけされたユーザ一覧
Query (Table = ImageTags, Hash = f93bar, Range = *)
あるユーザがタグづけされている画像の一覧を取得したかったら...?
応用
あるユーザのある時刻以降の画像を取得する場合
User による LSI を Date に貼る
パーティションキーは同一なので、LSI でよい
table:table
User Date Image
Bob 2013-10-01 ae4c
Bob 2013-09-05 cf2e2
Bob 2013-10-08 f93bae
Alice 2013-09-12 ca61a
あるユーザがタグづけされている画像の一覧を取得する場合
User による GSI を Image にはる
パーティションキーが異なるので、GSI となる
table:table
User Image
Bob ard4c
Bob f93bar
Alice aed4c
Alice f93bae
マルチプレーヤーバトル
複数プレーヤーに対し、ボスの HP を削る処理
RDB だと、
低遅延実行が難しい
ロックがありDBに負荷がかかる
Conditional Update を利用する
成功したらダメージ反映とする
失敗したら誰かが倒したとして処理する
投票システム
候補者をパーティションしていると、偏りが生じる可能性
ランダムなサフィックスをつけると分散できる
応用
Write Sharing
集計に利用する
ランダムなサフィックスをつけたパーティションを集計し、定期的に 1 つのテーブルにまとめる