像stackoverflow一样指向系统

时间:2009-09-09 19:17:33

标签: php mysql logic

我试图在我的程序中创建一个类似于堆栈溢出的点系统,即当用户做了一些好事(活动)时,他/她的点数增加了。我想知道在db schema + logic方面实现这个的最佳方法是什么。

我可以想到三个选择:

  1. 在users表中添加一个名为points的额外字段,每次用户执行某些操作时,将其添加到该字段中(但这将无法显示各种活动)
  2. 创建一个函数,该函数将在每次用户做好事时运行,并从头开始计算值并更新点数字段
  3. 每次使用不带任何点字段的函数计算。
  4. 最好的方法是什么?谢谢你的时间。

6 个答案:

答案 0 :(得分:2)

就个人而言,我会使用第二个选项来解决这个问题。

第一个选项限制功能,所以我马上消除了它。

第三个选项在性能方面效率低下 - 很可能你会获取很多这个数字,如果你的程序类似于stackoverflow,可能会显示(计算)该数字每次浏览/操作多次。

对我来说,第二个选择是一个不错的混合解决方案。通常,我讨厌在我的系统中有重复的数据(动作和点,而不是一个或另一个),但在这种情况下,整数字段是每个用户相当少的空间,可以节省你的空间很多时间不必要地重新计算值。

我们有时必须交换数据存储空间以提高性能,反之亦然,我认为#2是一种权衡,可以极大地帮助应用程序。

答案 1 :(得分:0)

我会选择1和2(每分钟左右在cron中运行)。

这样: - 额外字段将充当点数的缓存。 - 计算点数的函数可以是单个SQL查询,它会立即重新计算所有用户的点数,以获得一定的速度。

我认为每次收到积分时重新计算该字段都是一种过度杀伤。

答案 2 :(得分:0)

这在很大程度上取决于您将面临的预期计算次数。事实上,出于性能原因,我显然使用的方法类似于你的1)方法。

如果因素发生变化,这也可以防止数字跳跃(例如已获得积分的已删除项目,或者此处成为社区维基的SO回复,点规则的更改,外部操作,例如在此处加入其他帐户等。 )

如果你想要一个recalc解决方案(2),你可以通过清除值(将其设置为NULL,这意味着“脏”)来实现“智能”缓存,每次进行点修改时,重新进行 - 当它为NULL时计算它,否则使用缓存。您还可以(作为非显式事件发生时的自我纠正措施)在一小时,一天或任何您认为冷杉之后清除值,以便在一定时间后强制重新计算,而与“脏”状态无关

答案 3 :(得分:0)

就个人而言,我会选择第一个选项,并添加一个“操作”表来跟踪您的活动历史记录。

当用户做了好事时,他们会在“操作”表中获得一个条目,其中包含操作和一些点值。点值可以来自另一个表或某个配置文件。相同的值将添加到用户记录中。

在任何时候,您都可以总结行动并获得用户总数,但是为了提高性能,只需在添加动作记录时进行更新就足够了。

答案 4 :(得分:0)

你的积分系统有多简单? 我认为某种日志/日志记录是好的,这样您就可以每天/每周/每月跟踪所有用户的活动

答案 5 :(得分:0)

查看http://code.google.com/p/userinfuser/

它的开源,允许您为应用程序添加点和徽章。它有Java,Python,PHP和Ruby绑定。