完全なクエリを実行せずに、レコードの次のレコードと前のレコードを取得するための最良の方法を探しています。私は完全に実装されたソリューションを用意しており、これを行うためのより良いアプローチがあるかどうかを知りたいと思います。
架空の八百屋のウェブサイトを構築しているとしましょう。彼のHTMLページに加えて、毎週、彼は自分のサイトで特別オファーのリストを公開したいと考えています。彼は、これらのオファーを実際のデータベーステーブルに配置することを望んでおり、ユーザーは3つの方法でオファーを並べ替えることができる必要があります。
すべてのアイテムには、オファーに関するより多くのテキスト情報と「前へ」および「次へ」ボタンを含む詳細ページも必要です。「前へ」ボタンと「次へ」ボタンは、ユーザーがリストに選択した並べ替えに応じて、隣接するエントリを指す必要があります。
(出典:pekkagaiser.com)
明らかに、「トマト、クラスI」の「次へ」ボタンは、最初の例では「リンゴ、クラス1」、2番目の例では「梨、クラスI」、3番目の例ではなしである必要があります。
詳細ビューのタスクは、毎回クエリを実行せずに、リストの並べ替え順序を唯一の利用可能な情報として使用して、次の項目と前の項目を決定することです(GETパラメーターを介して取得し?sort=offeroftheweek_price
、セキュリティへの影響を無視するとします)。 。
明らかに、次の要素と前の要素のIDをパラメーターとして渡すだけが、頭に浮かぶ最初の解決策です。結局のところ、この時点でIDはすでにわかっています。ただし、これはここではオプションではありません。この単純化された例では機能しますが、実際のユースケースの多くでは機能しません。
私のCMSでの現在のアプローチは、「ソートキャッシュ」と名付けたものを使用しています。リストがロードされると、アイテムの位置を。という名前のテーブルのレコードに格納しますsortingcache
。
name (VARCHAR) items (TEXT)
offeroftheweek_unsorted Lettuce; Tomatoes; Apples I; Apples II; Pears
offeroftheweek_price Tomatoes;Pears;Apples I; Apples II; Lettuce
offeroftheweek_class_asc Apples II;Lettuce;Apples;Pears;Tomatoes
明らかに、items
列には実際には数値IDが入力されています。
詳細ページで、適切なレコードにアクセスしsortingcache
、列をフェッチしてitems
展開し、現在のアイテムIDを検索して、前の隣人と次の隣人を返します。
array("current" => "Tomatoes",
"next" => "Pears",
"previous" => null
);
これは明らかに高価であり、限られた数のレコードに対してのみ機能し、冗長なデータを作成しますが、現実の世界では、リストを作成するためのクエリは非常に高価であり(実際)、すべての詳細ビューで実行することはできません。質問、そしていくつかのキャッシングが必要です。
私の質問:
これは、さまざまなクエリ順序の隣接レコードを見つけるための良い方法だと思いますか?
パフォーマンスとシンプルさの点でより良い方法を知っていますか?これを完全に時代遅れにする何かを知っていますか?
プログラミング理論では、この問題の名前はありますか?
「キャッシュの並べ替え」という名前は、この手法に適していて理解できるものですか。
この問題を解決するための認識された一般的なパターンはありますか?彼らは何と呼ばれている?
注:私の質問は、リストの作成や詳細ビューの表示方法に関するものではありません。これらは単なる例です。私の質問は、再クエリが不可能な場合にレコードのネイバーを決定する基本的な機能と、そこに到達するための最速かつ最も安価な方法です。
不明な点がございましたら、コメントを残してください。明確にします。
賞金を開始する-多分これに関するいくつかのより多くの情報がそこにあります。