代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

点系统,如stackoverflow

  •  2
  • Alec Smart  · 技术社区  · 15 年前

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

    我可以想到三种选择:

    1. 在“用户”表中添加一个称为“点”的额外字段,每次用户执行某项操作时,都将其添加到该字段中(但这将无法显示排序的活动)。
    2. 创建一个函数,它将在用户每次做好事时运行,并从零开始计算值并更新Points字段。
    3. 每次使用不带任何点域的函数计算。

    最好的方法是什么?谢谢你抽出时间。

    6 回复  |  直到 14 年前
        1
  •  2
  •   JoshJordan    15 年前

    就个人而言,我将使用第二个选项来处理这个问题。

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

    第三个选项在性能方面效率低下-很可能您将获取该数字 很多 如果您的程序类似stackoverflow,那么可能会在每个pageview/action中多次显示(计算)这个数字。

    对我来说,第二个选择是一个不错的混合解决方案。通常,我 憎恨 在我的系统中有重复的数据(操作和点,而不是一个或另一个),但在本例中,整数字段是每个用户节省的相当小的空间。 许多 不必要地重新计算值的时间。

    有时,我们必须为了性能而交换数据存储空间,反之亦然,我想说2是一种非常有益于应用程序的权衡。

        2
  •  0
  •   Lucero    15 年前

    这在很大程度上取决于您将要面对的预期计算的数量。事实上,很明显,出于性能原因,我假设使用了一种类似于1)方法的方法。

    这还可以防止在因素发生变化时出现数字跳变(例如,已删除的奖励积分的项目,或在此处成为社区wiki的答复,积分规则的变化,外部操作(例如在此处加入另一个帐户等)。

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

        3
  •  0
  •   Nick Presta    15 年前

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

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

    我认为每次接收到点时重新计算字段都是一种过度杀伤力。

        4
  •  0
  •   Jerod Venema    15 年前

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

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

    在任何时候,您都可以总结操作并获得用户总数,但是对于性能而言,在添加操作记录时简单地更新就足够简单了。

        5
  •  0
  •   Steve    15 年前

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

        6
  •  0
  •   Navraj Chohan    14 年前

    退房 http://code.google.com/p/userinfuser/

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