UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Architecture】ページネーション

ページネーションについてZalando社のRESTful APIガイドラインを参考に考えてみる

restful-api-guidelines-ja.netlify.app

ページネーションとはリストデータへのアクセスの際に、総件数を上限件数で分割して、分割単位(ページ)毎に取り出せるようにすること

数百件以上になる可能性のあるリストの場合はページネーションをサポートすべき

やり方は2つ

  1. オフセットベース:最初のページエントリをオフセット数値で特定する
    (Pros)何件目から取得するというシンプル方法。簡単なSQLで実装可能。100ページ中の51ページのように 特定のページにジャンプするようなユースケースでは有効。
    (Cons)件数が増えると処理が重い。リストにレコードの増減がある場合、オフセットがずれ、重複やロスト、障害を起こす可能性がある。
  2. カーソルベース:単一のキー要素で最初のページエントリを特定する
    (Pros)処理はより高速。リストにレコードの増減がある場合でも適切にページングできる(ただし、実装次第) (Cons)SQLが複雑になる。任意のページを表示するのが面倒。

効率を重視する場合、より高速な「カーソルベース」にすべきとガイドラインではいっている

カーソル(単一キー)はページの位置、ページネーションの方向、適用されたクエリフィルタを(暗号化)エンコードしたりするらしいが、それが煩わしくなければカーソルを検討してもよさそう

他参考

https://developers.facebook.com/docs/graph-api/using-graph-api/v2.4#paging