2008-09-22 74 views
4

在我們的Web應用程序中,搜索結果以可排序的表格顯示。用戶可以點擊任何列並對結果進行排序。問題有時候,用戶會進行廣泛的搜索並返回大量數據。爲了使可分類零件有效,您可能需要所有結果,這需要很長時間。或者我可以一次檢索到幾個結果,但是排序並不會真正奏效。顯示可能包含大量數據的可排序表的最佳做法是什麼?具有大量數據的可排序表格的最佳方法


感謝您的所有建議。我一定會考慮這些。

我們使用現有的具有可排序表的Javascript框架;結果的「大量」意味着數百個。問題是我們的用戶在某個遠程站點,並且很多延遲是從數據中心發送/接收數據的網絡時間。對數據庫端的數據進行排序並且一次只發送一頁結果頁面是很好的;但是當用戶點擊某個列標題時,會執行另一次往返行程,這總是會增加3-4秒。

嗯,我想這可能是網絡團隊的問題:)

+0

數你能否提供一些細節,以你正在運行的數據庫類型,什麼webstack你的使用? – 2008-09-22 21:10:41

回答

3

在數據庫級別使用排序分頁是正確的答案。如果您的查詢返回1000行,但只顯示其中的用戶10,則不需要通過網絡發送其他990行。

這是一個mysql示例。假設你需要從「人」的表10行,21-30:

 
SELECT * FROM people LIMIT 21, 10 
3

你應該做傳呼回在數據庫服務器上。例如。在SQL 2005和SQL 2008上有分頁技術。我會建議尋找無論您正在尋找什麼系統的分頁選項。

0

你可以在服務器上進行排序。 AJAX將消除全面更新的必要性,但仍然會有延遲。數據庫通常在排序時非常快速。

0

對於這些情況,我使用SQL Server端的技術,不僅利用數據庫進行排序,還使用自定義分頁來僅返回所需的特定記錄。

開始時實施起來有點痛苦,但之後的表現非常驚人!

0

「大量」數據有多大?數百行?成千上萬的?

排序可以通過JavaScript無痛地與Mochikit Sortable Tables完成。但是,如果數據需要很長時間才能排序(最有可能是一兩秒鐘或三秒鐘),那麼您可能希望向用戶提供一些可視提示,說明搜索正在發生,頁面不會凍結。例如,爲屏幕(a Lightbox燈)着色並顯示「排序」動畫或文字。

2

你在使用在2005年的SQL有一些很好的分頁選項,並使用向上ROW_NUMBER,讓你做尋呼數據庫服務器。我發現這個很好的Christian Darie's blog

例如這個過程用於頁面中的產品類別。你只是通過你想要的頁面編號和產品頁面等

CREATE PROCEDURE GetProductsInCategory 
(@CategoryID INT, 
@DescriptionLength INT, 
@PageNumber INT, 
@ProductsPerPage INT, 
@HowManyProducts INT OUTPUT) 
AS 

-- declare a new TABLE variable 
DECLARE @Products TABLE 
(RowNumber INT, 
ProductID INT, 
Name VARCHAR(50), 
Description VARCHAR(5000), 
Price MONEY, 
Image1FileName VARCHAR(50), 
Image2FileName VARCHAR(50), 
OnDepartmentPromotion BIT, 
OnCatalogPromotion BIT) 

-- populate the table variable with the complete list of products 
INSERT INTO @Products 
SELECT ROW_NUMBER() OVER (ORDER BY Product.ProductID), 
     Product.ProductID, Name, 
     SUBSTRING(Description, 1, @DescriptionLength) + '...' AS Description, 
     Price, Image1FileName, Image2FileName, OnDepartmentPromotion, OnCatalogPromotion 
FROM Product INNER JOIN ProductCategory 
    ON Product.ProductID = ProductCategory.ProductID 
WHERE ProductCategory.CategoryID = @CategoryID 

-- return the total number of products using an OUTPUT variable 
SELECT @HowManyProducts = COUNT(ProductID) FROM @Products 

-- extract the requested page of products 
SELECT ProductID, Name, Description, Price, Image1FileName, 
     Image2FileName, OnDepartmentPromotion, OnCatalogPromotion 
FROM @Products 
WHERE RowNumber > (@PageNumber - 1) * @ProductsPerPage 
    AND RowNumber <= @PageNumber * @ProductsPerPage 
相關問題