在需要将数据库流量保持在最低水平的调查中,存储问题和响应的最佳方法是什么?

Ian*_*oke 7 sql-server asp.net

背景
我正在撰写一份面向大量观众的调查.它包含15个问题,每个问题有五个可能的答案以及潜在的评论.

用户可以循环查看以任何顺序回答它们的所有15个问题,并且可以随时离开调查并返回以回答剩余的问题.

一旦在所有15个问题上尝试了答案,就会出现一个提交按钮,允许他们将问题作为最终答案提交.在该阶段之前,只要用户加载调查页面,就需要检索所有答案.

要求是用户只能在页面上看到一个问题,"上一个"和"下一个"按钮允许用户滚动查看问题.

要求
我可以在每次用户单击按钮并保存当前响应等时请求问题,但这将是对已经大量使用的数据库的大量命中.我没有时间购买新的服务器等,所以我必须用我所拥有的.有什么办法可以在用户机器和/或响应上缓存问题吗?显然,我需要响应数据是安全的,并且只有用户知道,所以我觉得有点卡住了最好的方法.有什么指针吗?

如果这意味着我会得到一些高质量的讨论和反馈,我准备在这个问题上提供100分的赏金.

Ray*_*Ray 1

您有三个需要平衡的要求:

  • 用户必须能够随时返回他们的调查
  • 用户输入的答案必须保存,以尽量减少数据丢失的可能性
  • 需要尽量减少数据库命中

任何涉及在不稳定位置(cookie、会话等)缓存答案的解决方案都会增加数据丢失的风险。最终的解决方案取决于您如何对这三个要求的重要性进行排序。如果数据库问题位于顶部,那么您要么需要冒数据丢失的风险,要么花费大量额外时间使用某种临时存储方案(如 Kevin 的平面文件想法)编写解决方案。

有几个人建议您可能过早地进行优化。我建议你首先考虑这个想法——也许这整件事没有实际意义。

但是,假设您的数据库情况是一个真正的问题,我认为您的最佳需求平衡将是一个立即保存数据库答案的系统(以防止数据丢失),但在您实际必须访问数据库时仔细管理。

  1. 当应用程序启动时(或当第一个用户请求调查时)将调查及其问题加载到应用程序缓存中。如果任何问题都有可能答案的选择列表,也请加载这些答案。您只需在应用程序生命周期(或缓存持续时间)内访问数据库一次即可加载调查数据。
  2. 当用户开始调查时,运行单个查询将任何现有答案(如果他们是回访用户)加载到会话中的对象中 - 可以像 <List>string. (如果您可以以某种方式识别新用户而无需访问数据库,那么您可以为新用户跳过此步骤。)
  3. 使用会话答案对象以及应用程序缓存中的调查问题对象来填充每个页面,而无需再次访问数据库。
  4. 当用户提交答案时,将其与会话答案对象进行比较,看看它是否已更改(她可能只是在包含先前输入的答案的页面上单击“下一步”)。如果答案是新的或已更改,则将其保存到数据库和会话答案对象中。
  5. 当用户离开调查时,您不需要执行任何操作 - 一切都已保存。

使用此方案,您可以点击数据库一次来加载调查,为每个用户启动(或重新启动)调查时点击一次数据库,并为每个新的或修改的答案点击一次。减少的程度可能没有您希望的那么多,但它为您提供了最好的数据保护。