ページネーションと並べ替えに関する問題
-
06-07-2019 - |
質問
私はデータベース指向の Web アプリケーションにおいて、サーバー側での並べ替えではなくクライアント側でのテーブルの並べ替えに依存する必要がある状況を調べています。私を悩ませている特定の状況の 1 つはページネーションです。
大きなテーブル (たとえば 10,000 行) をページ分割し、特定の列で並べ替えようとする場合、どのようなアプローチを取るのが最善でしょうか?
これに関連するいくつかの問題は次のとおりであると理解しています。
- テーブル全体を一度にクライアント側に返すことはできません
- JavaScript で 10000 件ものレコードを並べ替えることができません
- テーブルの並べ替えには、現在のページだけでなく、すべてのページの行の並べ替えが含まれます。
このリストにさらに追加すべき問題はありますか?
サーバーの負荷を最小限に抑えるために、クライアント側とサーバー側の対話を適切に組み合わせるには、どのようなアプローチが必要ですか?
追加:
データベースでソートして、reqd ページ、前のページ、次のページを返すのが最善の策のようです。
ここで次のように考えてみましょう。
ユーザーは、シリアル番号でソートされたテーブルのページ (10 の 3) にいます。ここで、ユーザーは「username」という名前のヘッダーをクリックして、テーブルをユーザー名で並べ替えたいと考えています。
質問:最終結果は「ユーザー名でソートされたページ (1/10)」になるべきですか、それとも「ユーザー名でソートされたページ (10/3)」になるべきですか?
非常に主観的な質問であることは承知していますが、何をお勧めしますか?またその理由は何ですか?
解決
クライアント側はシンプルに保つのが最善です。Javascript の並べ替え/ページングは、非常に小さな結果セットのみに使用されます。ユーザーがパフォーマンスの低下に気付かない程度に小さいものです。
サーバー側では、サーバーの負荷を最適化できます。
負荷は、より多くのページに対する頻繁なリクエスト、ページあたりの多数の行/列、および再ソートに対する頻繁なリクエストの形で発生する可能性があります。(フィルタリングについてはまだ話していません)
したがって、ユーザーによっては、 実際の使用状況, 、何らかの形式のキャッシュが必要になる場合があります。これらは、ユーザーが何をしているかを把握した後の提案であることに注意してください。
頻繁なページ リクエストの場合は、一部の Ajax リクエストで次の数ページ (および前のページ) をプリロードし、ユーザーのリクエストに応じて (JavaScript 経由で) 行をテーブルに交換することを検討してください。
ページ サイズが大きい場合は、データベースが同じ巨大なデータ チャンクを何度も吐き出す必要がないように、行を「最近使用した」アプリケーション (メモリ) キャッシュに保持することを検討してください。
頻繁に再ソートする場合は、SQL 内に結果のみを含むキャッシュ テーブルを保持するのが良い方法です。
そして常に、常にデータベースに適切にインデックスを付けてください。
追加の応答:
私の非常に主観的な答えは次のとおりです。ユーザー(私)は、任意のページからソートしたいと考えています。彼ら(私)に任せてください。行きたい場所にいても、アプリケーションによってリストの先頭に戻されることほど面倒なことはありません。
もう 1 つの考慮事項は、複数レベルの並べ替えです。シリアル番号、次にユーザー名によるソートを実装しますか?Microsoft Excel やユーザーが使い慣れているその他のアプリケーションの機能を考えてみましょう。ユーザーはおそらく、1 ページに戻されるなど、慣れ親しんだもので問題ないでしょう。
他のヒント
データベースは、データのソートおよび選択において真の獣です。したがって、最善の策は、クライアントにサーバーに「Z行でソートされたY行のページXが欲しい」と言うことです。その後、データベースが処理を行い、クライアントが結果を表示します。パフォーマンスを改善するには、クライアントのキャッシュ結果を作成し、さらに、現在のページを取得した後に次のページと前のページをリクエストして、リクエストに応じて即座に表示できるようにします。
最良のアプローチは、データベースレベルでソートとページングを行い、画面にのみ表示される元のデータのサブセットのみを返すことです。このシナリオにはjavascriptはありません。
何らかの理由でデータベースレベルでソートおよびページングできない場合は、サーバー側のスクリプトを使用して行う必要があります。このシナリオでもjavascriptはありません。
そして最悪のアプローチは、javascriptでソートとページングを行うことです。もちろん、明らかな理由でまったく推奨されません。
画面上の特定のページに配信されるものをデータベースでソートします。ほとんどの場合、より高速で、キャッシュされ、ブラウザでのそのような負荷が軽減されます。
必要に応じて、データが十分に詳細であり、その恩恵を受ける可能性がある場合は、クライアント側でjavascriptなどを使用してさらにサブソートを許可します。サブソート機能とは何かを保存することができますページ間で記憶されるように選択します。