【问题标题】:Paging design pattern for ajax applicationajax 应用程序的分页设计模式
【发布时间】:2012-03-23 20:37:29
【问题描述】:

我正在构建一个 ajax 应用程序,我可以选择如何构建数据分页功能。基本上,用户将使用 1,000 - 2,000 条记录,但只有 20 条记录同时从数据库加载,发送到客户端,然后缓存在本地会话存储中。这些记录是包含对象属性的 json 字符串(基本上是客户记录)。

这里有两个选择,假设我们正在处理 1,500 条记录,并且每页有 20 条记录。 难题是在哪里存储 1,500 个记录的 ID。

选项 1: 1,500 条记录的 ID存储为服务器会话中的 int 列表,并针对每个请求进行序列化和反序列化。客户端不知道每个页面的记录 ID,只是请求一个页码。在服务器上,当用户请求页面 X 时,我们查看 int 列表并确定页面 X 的记录 ID,加载这些记录并将具有这些 ID 的 json 字符串发送给客户端。这里的缺点是我们在服务器会话中携带了一个包含 1,500 个整数的列表。好处是当我们请求一个页面时,我们只是向服务器发送一个 int。

选项 2: 1,500 条记录的 ID 在用户登录时发送到客户端,然后该列表存储在本地存储会话中。当用户请求页面 X 时,javascript 函数确定页面 X 上的记录 ID,并向服务器发送 20 个整数的 json 序列化列表。然后服务器返回具有这些 ID 的记录。好处是服务器端会话更轻,应该会提高性能(无需在每次请求时读取/写入/序列化该列表)并且可能更具可扩展性。缺点是每次请求页面时,我们都会向服务器发送一个包含 20 个整数的列表。

我倾向于选项 2:这是最好的方法吗?

注意 1) 我要求用户支持 HTML5 本地存储和 2) 服务器端实现将是 azure 和 WCF。

【问题讨论】:

  • 为什么客户端(或服务器)需要存储这些 ID?你不能只存储当前页码并获取下一页吗?看起来你做的工作比你需要的多,但也许我错过了一些东西。
  • 您是否使用 SQL 处理数据?或者它们存储在其他地方?而如果你使用 SQL 是否需要缓存数据呢?如果没有,那么您可以使用 SQL 的直接分页命令,避免保留页码和页面大小以外的任何内容。
  • 把1500个id存入数据库?!?客户请求页码?繁荣完成。
  • 如果数据对所有用户都是通用的,那么使用 Application.Cache 似乎是合理的。如果数据可能超过 5MB,您可能会遇到可用的本地存储 (stackoverflow.com/questions/7267354/…) 的麻烦。如果 SQL Server 是新的 2012 版本,那么每次访问数据库(sqlblog.com/blogs/aaron_bertrand/archive/2010/11/10/…)可能是合理的。
  • 您是否测量过额外查询对服务器会话的影响?这就是我倾向于的,但我想在决定之前查看数据。

标签: asp.net ajax wcf azure


【解决方案1】:

也许我理解错了,但我不太了解您的方法。如果您知道页面长度并且您知道所需的页码,为什么不能在 ajax 调用中将这些作为参数发送到服务器,然后在 db.sql 语句中将其限制为这一点。我的意思是首先知道这些 ID 有什么意义。例如查看 jquery 数据表插件如何在此处执行分页:http://www.datatables.net/examples/server_side/server_side.html。如您所见,他们使用将页码和页面位置发布到服务器的方法。然后,基于此限制您想要返回的行非常容易(至少在 Oracle、MySQL 和 MS SQL 中)。除非我完全错过了这一点,否则请告诉我。

【讨论】:

  • 因为如果我知道 ID,那么我可以说“给我获取 ID 为 x、y、z 的记录...”。如果我不知道 ID,在我什至可以请求记录之前,我需要说“去获取所有 ID 的列表并找出哪些记录在第 X 页上”,然后才能请求记录。知道 ID 可以节省一个查询,这就是我缓存它们的原因;现在我需要弄清楚最好将它们存储在哪里:服务器端会话或本地存储。
  • 每个人似乎也都觉得上面...它仍然每页 20 条记录...简单的解决方案,简单的解决方案。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多