分页和排序的问题

时间:2009-06-23 06:31:39

标签: sorting web-applications pagination html-table

我正在研究面向数据库的Web应用程序中的情况,当应该依赖于客户端对表的排序而不是服务器端的排序。困扰我的一个特殊情况是分页。

当尝试对一个大表(例如10000行)进行分页,以及按特定列对其进行排序时,最佳方法是什么?

据我所知,与此相关的一些问题是:

  • 我无法一次性将整个表格返回给客户端
  • 我无法使用javascript
  • 对多达10000条记录进行排序
  • 对表格进行排序将涉及对所有页面中的行进行排序,而不仅仅是当前页面。

那么您还有什么问题需要添加到此列表中吗?

哪种方法可以实现客户端和服务器端交互的良好组合,从而最大限度地减少服务器负载?


此外:

好的,在数据​​库上排序并返回reqd页面,上一页和下一页似乎是最好的选择。

现在考虑一下:

用户在按序列号排序的表的页面(第3页,共10页)中。现在,用户单击名为“username”的标题,希望按用户名对表进行排序。

问题:最终结果应该是“按用户名排序的页面(10个中的1个)”还是应该是“按用户名排序的页面(10个中的10个)”?

我知道这是一个非常主观的问题,但你会推荐什么?为什么?

4 个答案:

答案 0 :(得分:3)

数据库在排序和选择数据时是真正的野兽。因此,最好的办法是让客户对服务器说“我希望页面X的Y行按Z排序”。然后数据库完成它的工作,客户端显示结果。为了提高性能,您可以使客户端缓存结果,此外,您可以在获取当前页面后,使代码请求下一页和上一页,以便在请求时立即显示它们。

答案 1 :(得分:3)

客户端最好保持简单:Javascript排序/分页仅适用于非常小的结果集 - 足够小以至于用户不会注意到性能损失。

服务器端是您可以优化服务器负载的地方:

加载可以是频繁请求更多页面,每页大量行/列以及频繁请求求助的形式。 (我们甚至没有谈过过滤)

因此,根据您的用户和实际使用情况,您可能需要某种形式的缓存。请注意,这些是您知道用户正在做什么之后的一段时间的建议:

  • 对于频繁的页面请求,请考虑让一些Ajax请求预加载下几个(和之前的)页面,然后根据用户请求将行(通过Javascript)交换到表中。

  • 对于较大的页面大小,请考虑将行保留在“最近使用的”应用程序(内存)缓存中,以便数据库不需要一遍又一遍地吐出相同的大块数据

  • 对于频繁求助,一个好的方法是在SQL中保留缓存表,只显示结果。

始终,始终始终正确地索引数据库。


其他回复:

我非常主观的回答是:用户(我)想要从任意页面排序。让他们(我)。没有什么比你想成为的地方更烦人了,让应用程序把你带回到列表的开头。

另一个考虑因素是多级排序:您是否希望按序列号实现排序,然后是用户名?考虑Microsoft Excel的功能或用户熟悉的任何其他应用程序。您的用户可能会对他们习以为常的内容感到满意 - 包括被抛回第1页。

答案 2 :(得分:0)

最好的方法是在数据库级别进行排序和分页,并仅返回仅在屏幕上显示的原始数据的子集。在这种情况下没有JavaScript。

如果由于某些原因您无法在数据库级别进行排序和分页,那么您应该使用服务器端脚本来执行此操作。在这种情况下也没有javascript。

最糟糕的方法是使用javascript进行排序和分页,这当然是不推荐的。

答案 3 :(得分:0)

让数据库对传递到屏幕上特定页面的内容进行排序。它几乎总是更快,缓存并减轻浏览器上的负载。

如果您愿意,让客户端允许通过javascript等进一步进行子排序,如果数据足够详细并且可以从中受益。您可能希望存储哪些子排序功能是选择这样以便在页面之间记住它们。