ホームページ > バックエンド開発 > PHPチュートリアル > カーソルベースのページネーションを使用したリアルタイムデータをページングします

カーソルベースのページネーションを使用したリアルタイムデータをページングします

Jennifer Aniston
リリース: 2025-02-20 08:42:10
オリジナル
983 人が閲覧しました

カーソルベースのページネーションを使用したリアルタイムデータをページングします

ページネーションは、ページと呼ばれるより小さな部分に大きなレコードセットを破壊するための手法です。開発者としては、ページネーションの実装に精通している必要がありますが、リアルタイムのデータにページネーションを実装することは、経験豊富な開発者であっても注意が必要です。このチュートリアルでは、リアルタイムのデータページネーションとカーソルベースのページネーションのための実際のユースケースとソリューションについて説明します。

キーテイクアウト

    ページネーションは、ページと呼ばれる大規模なレコードセットをより小さな部分に分割するために使用される方法です。リアルタイムデータのページネーションの実装は、頻繁に更新されるため、データを追加または削除する際の不正確な結果の可能性があるため、困難な場合があります。 TwitterやFacebookなどのさまざまなソーシャルネットワーキングサイトが、リアルタイムデータページネーションの実装に成功しています。彼らは、ページネーションの記録数ではなく、一意の識別子(カーソル)に依存するカーソルベースのページネーションを使用します。
  • カーソルベースのページネーションには、TwitterのMAX_IDパラメーターまたはFacebook後のパラメーターと同様に、一意のシーケンシャル値を持つ少なくとも1つの列が必要です。また、限られた数の結果をフィルタリングするためのカウントパラメーター、およびデータをナビゲートするための次のURLと以前のURLも必要です。
  • カーソルベースのページネーションは、一般に、特にリアルタイムデータまたは大規模なデータセットの場合、オフセットベースのページネーションよりも効率的で信頼性が高くなります。サーバーの負荷を削減し、ページネーションプロセスをより速く、より効率的にします。
  • カーソルベースのページネーションの実装には、カーソルとして使用する一意の識別子を決定する、このカーソルに基づいてレコードを取得するためにデータベースクエリを変更すること、アプリケーションのUIを更新してページングされたデータを処理し、ユーザーがユーザーにできるようにするなど、いくつかのステップが含まれます。ページをナビゲートします。
  • リアルタイムのデータページネーションの問題の特定
  • Wikipediaは、リアルタイムデータを収集直後に提供される情報として定義しています。提供された情報の適時性に遅延はありません。 このようなアプリケーションでは、頻繁に更新されるため、正確な塗装データを提供することは困難です。リアルタイムデータを管理する際の標準的なページネーションの問題を見てみましょう。
データが静的であり、頻繁に変更されないと想定しています。デフォルトのページネーションでは、取得したレコードセットがいくつかのページに分割されます。データが頻繁に変更されないため、ユーザーはページネーションが正確に機能しているように感じますが、新しいデータを追加したり既存のデータを削除したりすると、ページネーションの結果が不正確になります。

ページネーションは、個々のレコードの代わりにレコードカウントのみを考慮します。レコードは、合計レコードカウントを使用してページに分割され、正常にパジネートされます。各レコードがページネーションの正しいページに分類されるかどうかは考慮していません。これにより、レコードが冗長に表示される可能性があります

これらのポイントを考慮すると、リアルタイムデータを処理するためのデフォルトページネーションテクニックに使用することは困難です。実用的なシナリオを使用して問題を特定してみましょう。

最初に20のレコードがあり、10を使用してレコードをページに分割するために制限として使用していると仮定します。次の画像は、レコードがどのようにページに分割されているかを示しています。

カーソルベースのページネーションを使用したリアルタイムデータをページングします最初のページにあるときに、結果セットが5つの新しいレコードによって更新されると仮定します。次の画像は、現在のシナリオを示しています

次に、2番目のページに移動します。最初の画像に基づいて、1〜10のレコードを取得する必要があります。ただし、数字15〜6のレコードが取得されます。レコード番号15-11が最初のページと2番目のページの両方に表示されることを明確に確認できます。 カーソルベースのページネーションを使用したリアルタイムデータをページングします

リアルタイムデータページネーションの実用的なユースケース

私たち全員が知っているように、ホイールを再発明することは、開発者がすべきことではありません。私たちは、独自の構築を考える前に、これらの問題を解決したサイトの既存のページネーション技術を調べる必要があります。 TwitterやFacebookなどの多くのソーシャルネットワーキングサイトは、ユーザープロファイルにリアルタイムデータを提供しています。このセクションでは、最も人気のあるサイトのいくつかを使用して、リアルタイムデータページネーションの実際のユースケースを検討します。

Twitter APIカーソルベースのページネーション

Twitterユーザープロファイルには新しいツイートが頻繁に入力されているため、Twitterタイムラインデータ検索メカニズムは、リアルタイムのデータフィードでページネーション技術を特定するための適切なスタートになるはずです。 Twitter APIメソッドを使用してそれがどのように機能するかを見てみましょう。

以下には、Twitter API検索ツイート方法へのサンプルリクエストが含まれています。

上記のURLでは、「PHP」という単語を含む最新のツイートを要求し、カウントパラメーターを使用して結果を10のブロックに分割します。これは、記録数で返信するオフセットページネーションの典型的な動作です。しかし、ここでは、bund_idとmax_idと呼ばれる2つの追加のパラメーターを見ることができます。これにより、カーソルベースのページネーションが可能になります。以前の例を使用してカーソルベースのページネーションがどのように機能するかを見てみましょう。

20ページに20のレコードが分かれており、最初のページにいると仮定します。 5つの新しいレコードがリストの上部に追加されます。次の画像では、現在のシナリオをプレビューします。

https://api.twitter.com/1.1/search/tweets.json?q=php&since_id=24012619984051000&max_id=250126199840518145&result_type=recent&count=10
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次に、Twitter検索リクエストの最初のページに生成された応答の一部を見てみましょう。完全な応答形式はこちらから表示できます。

https://api.twitter.com/1.1/search/tweets.json?q=php&since_id=24012619984051000&max_id=250126199840518145&result_type=recent&count=10
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ご覧のとおり、Search_Metadataセクションでは、結果に関する詳細を提供します。 Paginateのレコードが増える場合に備えて、next_results URLが生成されます。主に、ページネーションにMAX_IDパラメーターを使用しています。各応答を使用すると、MAX_IDパラメーターを取得し、それを使用して次の結果セットを生成できます。 MAX_IDパラメーターを使用して、指定されたIDよりも古い結果を受信します。 この例では、レコード20-11を表示しながら、MAX_IDパラメーターをレコード11として取得する必要があります。次に、MAX_IDを渡して次の結果セットを生成します。したがって、次の画像に示すように正確な結果が得られます。

ご覧のとおり、オフセットベースのページネーションで10ではなく上部で15のレコードを排除することにより、2ページ目の正確な結果が得られます。カーソルベースのページネーションでは、ページが急速に変化するため、ページの概念を考慮することはできません。そのため、結果は以前または次と見なされます。一般的に、MAX_IDは正確な結果を生成するのに十分効果的ですが、前後にパジをパジングしながらanse_idも不可欠であるシナリオがある場合があります。 Twitterの開発者セクションでMAX_IDとANSE_IDの両方を使用するより高度な例を見ることができます。 カーソルベースのページネーションを使用したリアルタイムデータをページングします Facebook APIカーソルベースのページネーション

FacebookのAPI実装は、両方のAPIが同じ理論を使用しているにもかかわらず、Twitterと比較してわずかに異なります。 Facebook APIリクエストのサンプルの応答を見てみましょう。

ご覧のとおり、Facebookは、以前と後に呼び出される2つの文字列ベースのカーソルを使用します。 Facebookでは、前のカーソルがページの開始を指し、後のカーソルがページの最後を指します。

リアルタイムデータを使用したほとんどのAPIは、このメカニズムを使用して結果を正確にページングします。開発者として、既存のAPIを使用し、必要に応じて独自のAPIを使用するために、カーソルベースのページネーションの背後にある理論を知る必要があります。

リアルタイムデータのページネーションの構築の基本
"search_metadata": {
  "max_id": 250126199840518145,
  "since_id": 24012619984051000,
  "refresh_url": "?since_id=250126199840518145&q=php&result_type=recent&include_entities=1",

  "next_results": "?max_id=249279667666817023&q=php&count=10&include_entities=1&result_type=recent",

  "count": 10,
  "completed_in": 0.035,
  "since_id_str": "24012619984051000",
  "query": "php",
  "max_id_str": "250126199840518145"
}
ログイン後にコピー

リアルタイムデータページネーションの実装は、このチュートリアルの範囲を超えた複雑なタスクであるため、カーソルベースのページネーションを理解するための単純なページネーションメカニズムを作成するプロセスを調べます。

以前に説明した例を使用して、カーソルベースのページネーションの基本的なコンポーネントを特定しましょう。

カーソル - カーソルベースのページネーションを実装するには、一意のシーケンシャル値を持つ少なくとも1つの列が必要です。これは、TwitterのMAX_IDパラメーターまたはFacebook後のパラメーターに似ています。

カウント - カーソルの前後に限られた数の結果をフィルタリングするためのオフセットベースのページネーションと同様に、カウントパラメーターが必要です。

  • 次のURL - これは、APIを介してページネーションを提供している場合に必要です。ユーザーは、次のページが利用可能かどうか、次のデータセットを取得する方法を知る必要があります。

  • 以前のURL - これは、APIを介してページネーションを提供している場合に必要です。ユーザーは、前のページが利用可能かどうか、次のデータセットを取得する方法を知る必要があります。
  • これらは、カーソルベースのページネーションの基本的なニーズです。開発者は、多くの場合、オフセットベースのページネーションを使用して、カーソルベースのページネーションで作業する機会を得ることはめったにないため、適切なシナリオでそれらを使用するための各手法の違いと利点を特定することが重要です。

  • オフセットページネーションでは、任意の列で並べ替えて結果をpagineすることができますが、カーソルベースのページネーションは一意のカーソル列の並べ替えに依存します。

    オフセットページネーションには、次のリンクと以前のリンクに加えてページ番号が含まれています。しかし、データの非常に動的な性質のため、カーソルベースのページネーションのページ番号を提供することはできません。
    • 一般的に、オフセットページネーションを使用すると、カーソルベースのページネーションが主にフォワードナビゲーションに使用されます。

      これまでのところ、カーソルベースのページネーションの基本的なニーズと違いを調べました。これで、サンプルの実装に移動して、それがどのように機能するかを特定できます。
    • 基本的なカーソルベースのページネーションの実装
    • 最初に、PDOを使用してデータベース接続を作成します。次に、結果をページングするためにHandlePaginationData関数を実行します。

      次に、MAX_IDまたはMIN_IDパラメーターがURLで使用できるかどうかを確認します。 MAX_IDは、Facebookの後のパラメーターに似ており、前方にナビゲートするために使用されます。 min_idは、facebookの前のパラメーターに似ており、後方にナビゲートするために使用されます。また、ナビゲーションの方向、max_idまたはmin_idを使用した句とソート順序を設定します。
    その後、クエリを実行して完全な結果カウントを取得し、その後に同じクエリが続き、結果を狭めるために同じクエリが続きます。

    前の方向に横断している場合は、並べ替えをASCに変更する必要があります。それ以外の場合は、前のページではなく最新のレコードを取得します。配列のレコードを逆にして、それらを下降として表示します。

    その後、結果をループします。ループ中に、最初のレコードのIDをmin_idとして、最後のレコードをmax_idとして割り当てます。これらのカーソル値は、重複を排除することにより、正確なデータをフィルタリングするために使用されます。
    https://api.twitter.com/1.1/search/tweets.json?q=php&since_id=24012619984051000&max_id=250126199840518145&result_type=recent&count=10
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー
      最後に、ページネーションリンクを実装するためのページネーター関数を見ることができます。
    • 次のコードには、このセクションで生成されたページネーションの初期化コードが含まれています。
      https://api.twitter.com/1.1/search/tweets.json?q=php&since_id=24012619984051000&max_id=250126199840518145&result_type=recent&count=10
      ログイン後にコピー
      ログイン後にコピー
      ログイン後にコピー
      ログイン後にコピー

      今では、リアルタイムのデータページネーションの仕組みを理解するための単純なデータページネーションサンプルがあります。このコードを使用して、結果を介してページングします。ページング中に、テーブルの端にいくつかのレコードを追加して、リアルタイムにします。次に、前後にページのデータの複製を確認します。違いを理解するためにオフセットベースのページネーションで同じことをしてください。

      結論

      このチュートリアルでは、カーソルベースのページネーションを使用したリアルタイムデータページネーションの背後にある理論を学びました。以下のコメントであなたの考えや経験を教えてください!

      カーソルベースのページネーションに関するよくある質問(FAQ)

      オフセットベースのページネーションとカーソルベースのページネーションの主な違いは何ですか?

      オフセットベースのページネーションでは、最初から一定数のレコードをスキップしてから、セット数のレコードを取得します。ただし、この方法では、ページネーション中にデータが追加または削除された場合、レコードを複製するなどの問題につながる可能性があります。一方、カーソルベースのページネーションは、最後のフェッチされたレコードの一意の識別子(カーソル)を使用して、次のレコードセットを取得します。この方法はより効率的であり、オフセットベースのページネーションに関連する問題を回避するため、リアルタイムデータに最適です。 - ベースのページネーションは、最後のフェッチレコードの一意の識別子(カーソル)を使用して次のレコードセットを取得するため、リアルタイムデータに特に効果的です。これは、ページネーションプロセス中に新しいデータが追加されているか、既存のデータが削除されたとしても、カーソルが正しい次のレコードを指し、レコードが見逃さないか重複していないことを保証することを意味します。あらゆるタイプのデータとともに使用しますか?ただし、効率が重要なリアルタイムデータまたは大規模なデータセットでは特に効果的です。カーソルは、次のレコードのセットを取得するために使用できるタイムスタンプや一意のIDなどの一意の識別子にすることができます。カーソルベースのページネーションは、一度に処理する必要があるデータの量を減らすことでパフォーマンスを向上させます。すべてのレコードを取得してから特定の番号をスキップする代わりに、カーソルベースのページネーションは、カーソルに基づいて次のレコードセットを取得するだけです。これにより、サーバーの負荷が削減され、ページネーションプロセスがより速く効率的になります。

      アプリケーションにカーソルベースのページネーションを実装するにはどうすればよいですか?

      アプリケーションにカーソルベースのページネーションの実装には、いくつかのステップが含まれます。まず、カーソルとして使用する一意の識別子を決定する必要があります。これは、タイムスタンプ、一意のID、またはその他の一意の値です。次に、データベースクエリを変更して、このカーソルに基づいてレコードを取得する必要があります。最後に、アプリケーションのUIを更新して、ページ化されたデータを処理し、ユーザーがページをナビゲートできるようにする必要があります。ページネーションは、オフセットベースのページネーションよりも効率的で信頼性が高く、いくつかの潜在的な欠点があります。たとえば、特にデータがカーソルとして使用する明確な一意の識別子がない場合、実装する方が複雑になる可能性があります。さらに、特定のページ番号にジャンプする必要がある場合など、すべてのユースケースに適していない場合があります。 - ベースのページネーションは、GraphQLで使用できます。実際、GraphQLには、リレー仕様を介したカーソルベースのページネーションのサポートが組み込まれています。これにより、GraphQLアプリケーションに効率的で信頼性の高いページネーションを簡単に実装できます。カーソルとしてのタイムスタンプや一意のIDなどの識別子。次に、このカーソルに基づいてSQLクエリを変更してレコードを取得し、「WHERE」と「LIMIT」条項を使用してレコードの範囲を指定して取得します。 api?

      Slackは、APIでカーソルベースのページネーションを使用して、大量のデータを効率的に取得します。彼らはカーソルとして一意の識別子を使用し、API応答でこのカーソルを提供して、クライアントが次のレコードセットを取得できるようにします。これにより、高性能と信頼性を備えた大規模なデータセットを処理することができます。 Cursorとして識別子およびAPI応答の「リンク」オブジェクトにこのカーソルを含めます。これにより、クライアントは、提供されたリンクに従って次のレコードセットを簡単に取得できます。この仕様は、JSON APIでカーソルベースのページネーションを実装するための標準的で一貫した方法を提供します。

    以上がカーソルベースのページネーションを使用したリアルタイムデータをページングしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    著者別の最新記事
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート