データのページングについて #19
こんにちわ!nekokakです!
十九日目はデータのページングについてです。
webの開発をしていると一度に大量のデータを表示させるのではなく、
10件ずつデータを表示させ、画面には次のデータへアクセスするためのリンクを用意する
いわゆるページングの処理を入れることが良くあります。
例えば、DBICを使っている場合は、
my $itr = $rs->search(...); my $pager = $itr->pager;
のように、DBIC側でData::Pageのオブジェクトを生成して、
データのページングをしやすいように提供してくれます。
DBICで開発している方は良く使われていることでしょう。
ただ、DBIx::Skinnyではこのような機能を提供していません。
理由としては、Data::Pageのオブジェクトを作成する為には、
検索対象となるデータが全部で何件存在するかを知る必要があるからです。
DBICの場合は、pagerメソッドを呼び出すと内部でcountクエリを発行し、
検索対象の全体件数を取得しています。
しかし、DBIx::Skinnyはsearch_by_sqlのように生のSQLを自分で書く事を前提としたORMなので
利用者が書いた任意のSQLを解析して同じ条件のcountクエリを発行することは
とても難しいことです。
なので、実装していません。
また、個人的にはDBICが内部で勝手にcountクエリを発行するのは嫌です。
というのも、あまり意識せずに使っていると想定しているよりも多くSQLが実行されてしまい
パフォーマンスに影響が出てくることが多いからです。
普段DBICを使って開発されている方は、DBICのクエリログ機能を使って、
発行しているSQLを一度全部見てみることをおすすめします。
もしかすると、想定異常にcountメソッドを発行しているかもしれませんよ。
(最近のDBICでは改善されているかもしれませんが)
じゃぁDBIx::Skinnyでデータのページングはどうすんだよ!
って思う人もいるとおもいますが、
http://d.hatena.ne.jp/nekokak/20090924/1253761408
こちらに以前まとめた記事があるので、参考にしてみてください。
今日はここまで。
明日はid:walf443先生が書いてくれます。
お楽しみに。
have a nice skinny days!:)