DynamoDB
https://gyazo.com/fab1f112e3ee235e2686fa4ddf24b511
KVS
完全マネージドサービス
installやupdateが不要
メンテナンス不要
DBの容量の設定も不要
暗号化、バックアップの設定も不要
苦手なこと
/mrsekut-book-12c311ea/10
データの集計
合計値や平均値を算出する機能はない
やるなら、自前で実装したりする必要がある
どれぐらいできるものなのか #??
複雑な検索
キーを指定することに依る検索しかできない
したい場合は、Amazon OpenSearch Serviceと組み合わせたりする
始め方
/mrsekut-book-12c311ea/15
参考
『DynamoDBをはじめる前に読む本』
入門
#WIP
コスト観点
/mrsekut-book-4046053550/328
サーバーレス型のDB
設計方針
https://zenn.dev/higashimura/articles/74c6e6bf63a133
具体的
GSI overloading
使用事例
https://aws.amazon.com/jp/blogs/news/how-amazon-dynamodb-supported-zozotowns-shopping-cart-migration-project/
zozotown
https://aws.amazon.com/jp/dynamodb/
どのような規模でも信頼性が高いパフォーマンスを維持できる
同時接続数が増加しても容易に対応できる
そのためAWS Lambdaなんかと相性が良い
マルチリージョン
マルチマスター
レイテンシーを 10ms未満に維持
組み込みのセキュリティ
バックアップと復元
インメモリキャッシュ
データの格納と取得に特化
期限切れになった項目を自動的にテーブルから削除することもできる
parimary keyの選択
/mrsekut-book-12c311ea/16
partition key
普通のRDBと同じノリ
パーティションキーは=の検索しかできない
どういうルールで付けるの #??
自動で連番にならないということは何かしらの規則が必要なのだろうけど
あるあるpartition keyはどんなの #??
test-0000とか?
sort key
ソートキーによって、sortや範囲検索ができる
データ追加する時に適当に付けて良いの #??
2#a#employee-0004みたいにして、(階数)#(フロア名)#(社員 ID)というformatを表したりする
/mrsekut-book-12c311ea/32
マジ??mrsekut.icon
RDB脳には考えられないな
文字列と区切り文字で何かを表現するのか
でも、他の人にとってはわかりにくいし、変更も容易じゃなくない #??
そこは妥協するのか?
用語
項目
RDBでの、record
属性
RDBでの、column
インデックス
グローバルセカンダリインデックス(GSI)
レプリカ
https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd
QueryFilter
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html
DynamoDBのtable設計
割とテクニックが要りそうmrsekut.icon
非正規化する
ユースケース駆動という感じmrsekut.icon
このtableはどのparameterで検索され、どのparameterを返すことを想定しているのか、などを考慮する
でも、それってアプリケーションの仕様変更されたら辛くならない #??
valueにjsonが入ることもある
/mrsekut-book-12c311ea/30
/mrsekut-book-12c311ea/32
同じ名前が、おなじ項目として存在することもあるのね
ユースケース駆動だからかmrsekut.icon
名前が変更になったときは、両方とも変更する必要がありそうだが、どうするのか #??
DynamoDB Streamsという機能を使う
ユースケースによってはJSONは辞めたほうが良いこともあるということか?
/mrsekut-book-12c311ea/34
むずかしーmrsekut.icon
partition keyで区切って、Many to Manyを表現する
/mrsekut-book-12c311ea/35
グローバルセカンダリインデックス(GSI)を使ったりもする
https://qiita.com/etaroid/items/a95f03bcf11a0a34e9ad
優れた設計のアプリケーションで必要なテーブルは1つのみ
必要な情報はなるべく1度のqueryで検索するのが理想
検索
/mrsekut-book-12c311ea/21
query
主キーで検索する
パーティションキーとソートキーの複合主キーmrsekut.icon
parittion keyなら=だし、sort keyなら範囲絞り込みなどができる
RDBのqueryと同じノリ
scan
クエリと違い、すべての項目と属性を読み込む
queryよりも検索の自由度が高い
queryより圧倒的に遅い
key関係なく全ての項目をscanするからかmrsekut.icon
そのため、基本的にscanのは使用は避けるべき
キーを指定せずにフィルターのみを使用するのが異なる点 #??
これ、異なる意味あるのか?
よくわからん
KVSの一般的な話だと思うが、良い属性の付け方がいまいちわからない
https://gyazo.com/738b259d9a6a588172cf85ed2b67f570
適当につけると、こんなふうにデータに依って異なる属性が付けられるがこれは良いのか #??
nameとusernameみたいに揺れることもありそうだが、その変の対処ってなんかあったりするのか #??
どうやってデータ追加する年 #??
/mrsekut-book-12c311ea/20
大きいデータの扱い
/mrsekut-book-12c311ea/38
1つの項目の最大サイズは400KB
1回のqueryで取得できる項目のサイズは1MB以内
Time To Live
/mrsekut-book-12c311ea/39
データ容量分の料金がかかるので、不要になったデータは消していきたい
Time To Liveを使うと有効期限を指定できる
過ぎたら勝手に消してくれる
DynamoDB Global Table
#??
どういう単位でtableを分けるのか?
rdbみたいに小さく分けるわけではないと思ってるけど、そうなのか?
ユースケース
/mrsekut-book-12c311ea/10
Serverlessをやるときによく使われる
AWS Lambdaと併用される
https://aws.amazon.com/jp/dynamodb/
ミリ秒単位のアクセスレイテンシーが求められる
データの拡張性が求められる
https://aws.amazon.com/jp/blogs/news/amazon-dynamodb-ad-tech-use-cases-and-design-patterns/
mrsekut.icon
関連投稿
マガジンの人気ランキング
https://dev.classmethod.jp/articles/dynamodb-chottowakaru/
https://qiita.com/leomaro7/items/383c1aa287c7daf49518
https://business.ntt-east.co.jp/content/cloudsolution/column-115.html
https://serverless.co.jp/blog/243/
https://www.slideshare.net/nekoruri/20170630-ssmjp-painful-architecture
https://serverless.co.jp/blog/232
/mrsekut-book-486354314X/055
https://speakerdeck.com/_kensh/dynamodb-design-practice