はじめに
ずっとRDB(ほぼmysql)で開発をしてきた自分がDynamoDBを使用した時にハマった事をざっくり記載します。
自分のメ同じような状況の方の参考になればと思います。
データを検索(where区)する時は、キーに指定したカラムしか検索できない
ハッシュキーとレンジキーに指定したカラムしか検索出来ないので、その他で検索したい場合は
ローカルセカンダリインデックス(LSI)かグローバルセカンダリインデックス(GSI)を使う必要があリます。
グローバルセカンダリインデックスを使えばある程度の検索条件の追加などはクリア出来そうです。
複数テーブルを更新する時にtransactionを使う事は可能
親子テーブル等の構成の時に一貫性を保って更新したい時はDynamoDBでもtransactionをかける事が可能です。
但し25アイテムまでと制限があるので同時にたくさんのレコードを更新する処理には向いてないと思います。
取得したデータ量が1mbを越えた場合、1mbまでのデータが取得される(残りは取得できない)
テスト時に少ないデータでテストをしているといつの間にか1mbを超えていて全てのデータが取得できて
いなかったと言った事になりそうなので、複数データを取得する場合などは最初から1mbを超えた場合を想定しておく事が必要そうです。
auto incrementのような機能はない
各テーブル毎のsequence numberを保存する専用のテーブルを作成し、アトミックカウンタを使うことにより実現する事は可能です。
scanは出来るだけ避けてqueryを使う
scanは常にテーブル全体がscanされるため、どうしてもという時以外使わないように設計しないとデータ量が増えた時等に問題になりそうです。
おわりに
仕様の更新等でだいぶ使いやすくなってきているような気はしますが、RDB経験者にはあまりドキュメントを読まずに実装しようとすると苦戦するポイントもあるように思います。
ドキュメントを読んでいくとまだ他にも制約などがありそうなので、経験者に聞くもしくはドキュメントを読み込んだ上で採用した方が良さそうです。