具有大量数据的可排序表的最佳方法
在我们的Web应用程序上,搜索结果显示在可排序的表中。用户可以单击任何列并对结果进行排序。问题有时是,用户进行了广泛的搜索并获得了大量返回的数据。为了使可排序部分正常工作,我们可能需要所有结果,这需要很长时间。或者我一次只能检索很少的结果,但是排序实际上并不能很好地工作。显示可能包含大量数据的可排序表的最佳实践是什么?
感谢所有建议。我一定会讲这些。
我们正在使用具有可排序表的现有Javascript框架;结果"很多"意味着数百个。问题在于我们的用户位于某个远程站点,而从数据中心发送/接收数据的网络时间造成了很多延迟。在数据库端对数据进行排序,一次只发送一页有价值的结果,这很好。但是当用户单击某些列标题时,将完成另一次往返,该往返总是增加3-4秒。
好吧,我想这可能是网络团队的问题:)
解决方案
我们应该在数据库服务器上回滚。例如。在SQL 2005和SQL 2008上有分页技术。我建议我们查看要查看的任何系统的分页选项。
我们可以在服务器上进行排序。 AJAX消除了完全刷新的必要性,但是仍然存在延迟。方面,数据库排序通常非常快。
对于这些情况,我在SQL Server方面采用了一些技术,这些技术不仅利用数据库进行排序,而且还使用自定义分页仅返回所需的特定记录。
刚开始时有点痛苦,但之后的性能却令人赞叹!
"大量"数据有多大?几百行?几千?
可以使用Mochikit可排序表轻松地通过JavaScript进行排序。但是,如果对数据进行排序需要很长时间(很可能是一两个或者两个[或者三个!]),那么我们可能希望向用户提供一些视觉提示,表明正在发生播散并且页面不仅冻结。例如,为屏幕(如Lightbox)着色,并显示"正在排序"的动画或者文本。
在数据库级别使用排序分页是正确的答案。如果查询返回1000行,但是只向用户显示10行,则无需通过网络发送其他990行。
这是一个mysql示例。假设我们需要从"人员"表中提取10行(21-30行):
SELECT * FROM people LIMIT 21, 10
我们正在使用哪个数据库,因为在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