DynamoDBって言ってますが、DynamoDBに限った話ではないです。
よくAPIの設計でページングのためにlimit/offsetを提供することがあると思いますが、これを読んだ方に伝えたい。
その設計は次からやめましょう止めましょう。
is 何故
ページングのためにlimit/offsetをとるAPIはよく見ます。
一般的なRDBでは、OFFSET関数が提供されており、それを利用すれば簡単に実装できますしそれに依存したIFと言ってもいいでしょう。
でも、DynamoDBのようなキーバリューストアのみ場合は実現が困難なため避けましょう。
解決策
RDBを使う。
一番幸せになれます。
しかし、謎の力でDynamoDBから逃れられない時があると思います。
じゃあどうするかというと、、
別案
ロジックで頑張る
Lambdaなどと組み合わせてロジックで解決する。
多分これで解決することになると思います。私もそうでした。
もちろんQueryの利用を前提に、メモリ効率とかを考える必要はありますが。。
Athenaを使う
AthenaもOFFSET関数を提供しているんです。
要件によってはDynamoDBからS3にデータを置いてクエリをかけることで実現できます。
また、コネクタも提供されているのでこちらで直接クエリもかけられるんじゃないかなと思っています。(未検証)
Amazon Athena DynamoDB コネクタ - Amazon Athena
IFを変える
limit/offsetの提供をやめちゃいましょう。
具体的には、トークンとページサイズを構えるIFにします。
そうすることで、OFFSET関数に依存したIFを隠蔽することができ、DynamoDBでも所謂カーソル処理的な感じで実現可能です。
ただし、以下のようなトレードオフもありますので注意しましょう。
- 双方向ページングができない
- 任意のページの要求に答えられない
この辺りの話は、この本が参考になります。 APIデザイン・パターン | マイナビブックス