2009-11-06 84 views
3

處理返回搜索結果的網頁的正確方法是什麼?這種搜索的結果可能會有不同的結果。尋呼:存儲搜索結果

I.e.第一次返回查詢可能包含與用戶在第2頁上單擊時不同的結果,並再次運行查詢。

大多數人如何處理這種情況?一般來說,我正在使用內部的ASP.Net應用程序(安全/帶寬並不是很大的擔憂),所以我會將結果存儲在ViewState中,並在回發處理與查詢數據庫相反的數據。

外部WWW使用的正確方法是什麼?我最好的猜測是將結果存儲在一個臨時數據庫表中(不是字面上的臨時表;我想'暫存'可能更準確),但是我認爲該表會因插入/刪除/ etc而受到很大影響,我認爲你需要一個清理桌面的過程,這看起來不是一個非常優雅的解決方案。

我在哪裏關門?

回答

2

大多數應用程序不處理它...他們認爲結果不會變化足以保證某種緩存機制。但是,如果你有高度的實時數據工作(如Twitter的結果,例如),您的分頁鏈接將最有可能是這樣的:

?q=your+query&olderthan={last result shown}&limit=10

...其中{last result shown}是對的ID在當前頁面上的最後結果。此ID將用於允許您查詢比指定ID更早的結果:SELECT * FROM table WHERE id < {last result shown}

+0

我已經看過這麼多次,這是一個有效的解決方案,但如果你想要或需要使用POST與GET,將無法正常工作。此外,這需要在您的應用程序中處理安全性 - 否則sombody可以將URL更改爲限制= 200000 - 並且如果您顯示產品列表,那麼可以說 - 您可以讓服務器受到攻擊並凍結瀏覽器:-) – konung 2009-11-06 20:01:29

+0

此方法僅適用於罰款與POST請求。只需將其放入'。關於界限......我認爲這是不言而喻的;) – brianreavis 2009-11-06 20:23:09

+0

我喜歡'olderthan'的概念。查詢字符串可以根據您允許的內容進行驗證,或者值可以存儲在視圖狀態中 – John 2009-11-06 20:32:10

1

雖然它可能會佔用大量內存,但您也可以考慮將搜索結果存儲到會話中並通過會話進行分頁,而不是每次都運行查詢。

1

會話如何?這是會話特有的臨時數據,爲什麼不使用會話?

我還沒有在年齡(從.NET時代之前:-))做asp,但在PHP或rails中,您可以使用會話來處理任何臨時存儲。您可以使用本地文件系統(在服務器上)或DB作爲會話存儲。有很多方法可以進行優化,所以我不會擔心數據庫受到攻擊,除非有成千上萬的用戶。此外,數據庫設計用於處理數千個插入和刪除操作 - 任何主要的數據庫--SQL服務器,MySQL,PostgreSQL都不應該有任何問題。