0

我正在开发一个评价地点的系统,这是我的问题。假设我的数据库中有这样的表:

places : id, name, description
place_marks : id, user_id, place_id, value, comment

当用户对地点进行研究时,我想向他发送按速率 desc 排序的地点列表。实现这一目标的最佳方法是什么?

解决方案 1

  1. 获取名称对应的所有地点
  2. 对于每个地方,计算标记
  3. 创建一个新的有序列表

解决方案 2

  1. 位置表中添加列标记
  2. 每次用户添加标记时,我都会计算标记
  3. 对于搜索,我只需要正确查询数据库

在解决方案 1 中,问题可能是性能问题(即使我在查询中计算标记),在解决方案 2 中,如何确保在计算标记时避免冲突?

我正在将 Play2 与 MySQL 一起使用。谢谢您的帮助。

4

1 回答 1

2

您在解决方案 2 中害怕什么样的冲突?我假设您指的是您正在计算一个标记的可能性,同时提供了一个新的标记,并且您再次开始相同的计算,其中第二个计算存储在第一个计算之前。换句话说,您没有最新的平均值。

在给出答案之前,我认为你应该让你的代码以最简单的方式工作。只有当您遇到问题时,我才会考虑优化。在您真正受益于任何优化之前,您将需要相当多的标记和访问者(假设是 Web 界面)。稍后优化它是我的建议。

对于答案,我会考虑 3 个选项。我不知道 Play2,所以我的答案是通用的。

1) 不在乎:这种情况发生的变化是相当有限的,只是流量非常大的问题。由于您只计算一个临时值(直到有新标记),我会忽略这种可能性。下次有人提供标记时,您的统计数据将是正确的。1a) 您可以每晚重新计算平均值,以确保它们在第二天是正确的。

2) 确保计算同步。换句话说,确保不会有 2 个计算同时开始。有多种选择,因为我不知道 Play2,所以我会参考提供更多信息。

3)这是最好的方法。由于您期望高流量,您希望确保您可以为您的客户提供服务。您最不想做的就是例如花费 50% 的 CPU 能力来进行计算。一种选择是在后台运行一个单独的进程,不时检查标记表。一旦检测到新标记,它将计算平均值。由于您只有 1 个进程,因此您限制了它所花费的 CPU 时间和数据库上的负载。在高负载期间,您的计算可能会有些迟钝,但是一旦负载较低,这将加快速度。

如果您真的想要交通繁忙,请选择选项 3)。根据您的问题,我建议您为您的产品采用选项 1),调查选项 2 以了解更多关于例如信号量的信息,并考虑将选项 3) 作为学习练习。

祝你好运。

于 2013-07-27T21:25:08.667 回答