4

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


感谢所有的建议。我一定会复习这些的。

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

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

4

6 回答 6

3

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

于 2008-09-22T20:54:54.343 回答
3

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

这是一个mysql示例。假设您需要 'people' 表中的 10 行,21-30:

SELECT * FROM people LIMIT 21, 10 
于 2008-09-22T21:04:26.677 回答
2

您正在使用什么数据库,因为在 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
于 2008-09-23T01:44:40.013 回答
0

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

于 2008-09-22T20:56:06.930 回答
0

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

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

于 2008-09-22T20:58:00.997 回答
0

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

排序可以通过 JavaScript 使用Mochikit Sortable Tables 轻松完成。但是,如果数据需要很长时间来排序(很可能是一两秒 [或三!]),那么您可能希望给用户一些视觉提示,表明正在发生某些事情并且页面并没有只是冻结。例如,给屏幕上色(例如 Lightbox)并显示“排序”动画或文本。

于 2008-09-22T21:01:52.597 回答