在数据库中存储用户点系统的最佳方法

时间:2010-11-27 16:03:16

标签: database-design

我目前正在开发一个小型应用,用户可以通过完成任务来累积积分。我想要的是关于设计数据库表的最佳方法的一些建议。在某些方面,系统类似于SO,用户完成任务(在你的回答问题上)然后他们的点更新余额。

我目前有一个用户表,用于存储常用的用户信息,但不知道如何推进。

我最好有一个积分表(用户有很多积分),然后添加user_id和积分金额;然后在查询用户点时,用给定的user_id拉出所有点并求它们加总?

有更有效的方法吗?

谢谢,

杰克

3 个答案:

答案 0 :(得分:3)

如果您只关注点总数,那么正如Oded建议的那样,只需将该字段直接包含在User表中即可。但是,如果您需要知道这些点是如何获得的,也许您可​​以拥有一个点交易表。然后,此事务表可以拥有User表的user_id字段的外键以及ActionPointsDate等各种字段。

  

我最好有一个积分表(用户   有很多要点)

为什么用户会有很多积分?如何,与各种类别相关的点数?正如Oded所提到的,这归结为这些要点的含义以及您想要了解的关于它们的信息(也与获得它们或对它们产生影响的用户有关,即投票回答减少了发布用户点数。)

答案 1 :(得分:1)

如果points没有用户没有任何意义并且与它有一对一的关系,我会将该字段直接放在user表上。

但是,如果您要为每个用户录制不同类型的点,我会创建一个points_type查找和一个points表,其中包含userpoints_type个ID

答案 2 :(得分:1)

额外分数表是一种公平的方法,因为它可以跟踪获得积分的原因。根据用户数量,点数交易和使用过的服务器,我会考虑保留一些常用的聚合:最常见的是用户总点数。

要在点表中插入新的点记录,您可以使用存储过程,该存储过程不仅会记录点表中的点,还会增加每个用户的点聚合。这个聚合可以保存在users表的一个单独的列中(如Oded所建议的那样)。

随着您的设计的进步,可能会出现可以预先计算的新的有用聚合。

但为了简单起见:只有在绝对必要时才使用这些聚合,例如计算用户的总点数需要太长时间。对于小型系统来说,实时计算这些总数确实不应该是一个问题。