在我们的Web应用程序中,搜索结果显示在可排序的表中。用户可以单击任何列并对结果进行排序。问题有时候,用户会进行广泛的搜索并返回大量数据。要使可排序部分工作,您可能需要所有结果,这需要很长时间。或者我一次可以检索几个结果,但是然后排序不会很好。显示可能包含大量数据的可排序表的最佳做法是什么?


感谢所有的建议。我一定会考虑这些。

我们正在使用具有可排序表的现有Javascript框架; "大量"结果意味着数百。问题是我们的用户位于某个远程站点,很多延迟是从数据中心发送/接收数据的网络时间。在数据库端对数据进行排序,一次只发送一页的结果是很好的;但是当用户点击某个列标题时,会完成另一次往返,这总是会增加3-4秒。

嗯,我想这可能是网络团队的问题:)

有帮助吗?

解决方案

在数据库级别使用排序分页是正确的答案。如果您的查询返回1000行,但您只是向用户显示10行,则不需要通过网络发送其他990。

这是一个mysql示例。假设你需要10个人,21-30,来自'people'表:

SELECT * FROM people LIMIT 21, 10 

其他提示

您应该在数据库服务器上进行回调。例如。在SQL 2005和SQL 2008上有分页技术。我建议您查看您正在查看的任何系统的分页选项。

您使用的是什么数据库,因为SQL 2005中有一些好的分页选项,而使用ROW_NUMBER可以在服务器上进行分页。我在 Christian Darie的博客中找到了这个好文章

例如,此程序用于分类类别中的产品。您只需传入您想要的页面编号和页面上的产品数量等

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

您可以在服务器上进行排序。 AJAX将消除完全刷新的必要性,但仍然存在延迟。方面,数据库通常非常快速排序。

对于这些情况,我在SQL Server端使用技术,不仅利用数据库进行排序,而且还使用自定义分页来返回所需的特定记录。

一开始实施起来有点痛苦,但之后的表现令人惊叹!

“很多”有多大?数据的?数百行?数千?

可以使用 Mochikit Sortable Tables 轻松地通过JavaScript进行排序。但是,如果数据需要很长时间才能排序(很可能是一两秒[或三个!]),那么您可能希望为用户提供一些视觉提示,即正在进行正在进行,并且页面不仅仅是冻结。例如,对屏幕(la Lightbox)着色并显示“排序”。动画或文字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top