Open5
ページング実装の検討メモ

前提
ここでいうページング(paging)処理というと,WebAPIで,大量のアイテムを,ある順序で部分的に繰り返し取得する処理のことをいう

選択肢
選択肢としては以下の二つがあるとする.
- オフセットページング (offset paging)
- カーソルページング (cursor paging)

オフセットページング
データベースをクエリする際,以下のようなクエリを発行する.
SELECT *
FROM a_table
ORDER BY a_column
LIMIT <page_size>
OFFSET <offset>;
クエリ観点からすれば,必要なインプットは,1. ページサイズに相当するLIMITと,2. 先頭からどれだけずらした箇所を取得するかというOFFSET の2つ
これはユーザー視点に置き換えると,ページ番号とページサイズと解釈できる
メリット
- ユーザーにとっても,開発者にとっても解釈しやすい
- 別途レコードの件数を取得すれば,全体の件数とページは何ページあるのかが簡単にわかる
- 比較的ソートに対する柔軟性が比較的高い
デメリット
- オフセットが増えると(後ろのほうのページを参照すると)その分スキャンするレコード量が増えて,性能が劣化することになる,
- レコードがINSERTされると,表示がずれる

カーソルページング
データベースをクエリする際,以下のようなクエリを発行する.
SELECT *
FROM a_table
WHERE a_column > <cursor>
ORDER BY a_column
LIMIT <page_size>;
クエリ観点からすれば,必要なインプットは,1. ページサイズに相当するLIMITと,2. どこ以降(あるいは以前)から取得するかのカーソル の2つ
ユーザーからすると,無限スクロールのUIで,スクロールすると次々に読み込まれるようなあの挙動
メリット
- レコードが途中でINSERTされても表示がずれない
- クエリの性能が劣化しづらい
デメリット
- 「前のページ」の実装が比較的複雑になる
- ページ番号を利用するようなUIだと対応するカーソルを算出するのが難しい
作成者以外のコメントは許可されていません