Php 像stackoverflow这样的积分系统

Php 像stackoverflow这样的积分系统,php,mysql,logic,Php,Mysql,Logic,我试图在我的程序中创建一个类似于堆栈溢出的积分系统,即当用户做了一些好事(活动)时,他/她的积分会增加。我想知道在db schema+逻辑方面实现这一点的最佳方式是什么 我可以想出三个选择: 在users表中添加一个名为points的额外字段,每次用户执行某项操作时,都将其添加到该字段中(但这将无法显示某种类型的活动) 创建一个函数,该函数将在用户每次行善时运行,它从头开始计算值并更新points字段 每次使用不带任何点字段的函数计算 最好的办法是什么?谢谢您的时间。就我个人而言,我会使用第二种

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

我可以想出三个选择:

  • 在users表中添加一个名为points的额外字段,每次用户执行某项操作时,都将其添加到该字段中(但这将无法显示某种类型的活动)
  • 创建一个函数,该函数将在用户每次行善时运行,它从头开始计算值并更新points字段
  • 每次使用不带任何点字段的函数计算

  • 最好的办法是什么?谢谢您的时间。

    就我个人而言,我会使用第二种方法来解决这个问题

    第一个选项限制了功能,因此我立即消除了这一点

    第三个选项在性能方面效率低下-很可能您将大量获取该数字,并且,如果您的程序类似于stackoverflow,则可能会在每个页面视图/操作中多次显示(计算)该数字

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

    有时,我们必须以数据存储空间换取性能,反之亦然,我认为#2是一种极大地有利于应用程序的权衡。

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

    以便: -额外的字段将充当点数量的缓存。 -计算点的函数可以是一个sql查询,它可以一次为所有用户重新计算点,以获得一定的速度


    我认为每次接收到点时重新计算字段是一种过分的做法。

    这在很大程度上取决于您将面临的预期计算数量。事实上,我认为出于性能原因,所以显然使用了一种与您的方法类似的方法

    这还可以防止在因素发生变化时出现数字跳跃(例如,被删除的项目会获得分数,或者此处的回复会变成社区wiki,分数规则发生变化,外部行为(例如加入此处的其他帐户等)


    如果recalc解决方案(2)是您想要的,您可以通过在每次可能发生点修改时清除该值(将其设置为NULL,这意味着“脏”)并在其为NULL时重新计算来实现“智能”缓存,否则使用缓存。你也可以(作为非显式事件发生时的自我纠正措施)在一小时、一天或任何你认为最早的时间后清除这些值,以便在一定时间后强制重新计算,而不受“脏”状态的影响。

    我个人同意第一个选项,并添加一个“操作”表以跟踪您的活动历史记录

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


    在任何时间点,您都可以汇总行动并获得用户总数,但就性能而言,只要在添加行动记录时更新就足够简单了。

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

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