我正在尋找檢索記錄的下一個和上一個記錄而不運行完整查詢的最佳方法。我有一個完全實施的解決方案,並想知道是否有更好的方法來做到這一點。爲下一個元素和上一個元素優化查詢
假設我們正在爲虛構的蔬菜水果店建立一個網站。除了他的HTML頁面,他每週都想在自己的網站上發佈一系列特別優惠。他希望這些報價位於實際的數據庫表中,用戶必須能夠通過三種方式對報價進行分類。
每個項目還必須有一個詳細信息頁面,其中提供了更多的文字信息以及「上一個」和「下一個」按鈕。取決於用戶爲列表選擇的排序,「上一個」和「下一個」按鈕需要指向相鄰條目。
alt text http://www.pekkagaiser.com/stuff/Sort.gif?
顯然,「下一個」按鈕「西紅柿,I類」必須「蘋果,類1」,在第一個例子中,「梨,I類」,在第二,沒有在第三。
詳細視圖中的任務是,以確定下一個和以前的項目,而不必每次一次運行一個查詢,以列表的排序順序作爲唯一可用的信息(比方說,我們得到的是通過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
);
這顯然是昂貴的,工程的只記錄數量有限,並創建冗餘數據,但是讓我們假設在現實世界中,以創建列表查詢是非常昂貴(這是),運行它在每一個細節視圖中都是不可能的,並且需要一些緩存。
我的問題:
你認爲這是要找出不同查詢訂單鄰近記錄的好習慣?
您是否知道在性能和簡單性方面的更好實踐?你知道一些讓它完全過時的東西嗎?
在編程理論中,是否有這個問題的名稱?
名稱「排序緩存」對於這種技術是否合適和可理解?
有沒有公認的常見模式來解決這個問題?他們叫什麼?
注:我的問題是不是建築列表,或者如何顯示詳細信息視圖。這些只是例子。我的問題是基本功能當重新查詢不可能時確定記錄的鄰居,以及最快和最便宜的方式到達那裏。
如果有什麼不清楚的地方,請留下評論,我會澄清。
開始賞金 - 也許有更多的信息在這裏。
我喜歡錶格格式。必須採取一段時間! (編輯!噢,這是一個圖像,我被欺騙了!) – 2010-02-22 11:13:31
@Jon是的,這是一個訣竅:)但Markdown似乎支持基本的HTML ...我會在下次嘗試該路線。 – 2010-02-22 11:15:24
@Pekka:雖然沒有表格。你必須以ASCII-Art的方式構建它們。 – Tomalak 2010-02-22 19:24:05