我目前正在开发一个小型应用,用户可以通过完成任务来累积积分。我想要的是关于设计数据库表的最佳方法的一些建议。在某些方面,系统类似于SO,用户完成任务(在你的回答问题上)然后他们的点更新余额。
我目前有一个用户表,用于存储常用的用户信息,但不知道如何推进。
我最好有一个积分表(用户有很多积分),然后添加user_id和积分金额;然后在查询用户点时,用给定的user_id拉出所有点并求它们加总?
有更有效的方法吗?
谢谢,
杰克
答案 0 :(得分:3)
如果您只关注点总数,那么正如Oded建议的那样,只需将该字段直接包含在User
表中即可。但是,如果您需要知道这些点是如何获得的,也许您可以拥有一个点交易表。然后,此事务表可以拥有User
表的user_id
字段的外键以及Action
,Points
,Date
等各种字段。
我最好有一个积分表(用户 有很多要点)
为什么用户会有很多积分?如何,与各种类别相关的点数?正如Oded所提到的,这归结为这些要点的含义以及您想要了解的关于它们的信息(也与获得它们或对它们产生影响的用户有关,即投票回答减少了发布用户点数。)
答案 1 :(得分:1)
如果points
没有用户没有任何意义并且与它有一对一的关系,我会将该字段直接放在user
表上。
但是,如果您要为每个用户录制不同类型的点,我会创建一个points_type
查找和一个points
表,其中包含user
和points_type
个ID
答案 2 :(得分:1)
额外分数表是一种公平的方法,因为它可以跟踪获得积分的原因。根据用户数量,点数交易和使用过的服务器,我会考虑保留一些常用的聚合:最常见的是用户总点数。
要在点表中插入新的点记录,您可以使用存储过程,该存储过程不仅会记录点表中的点,还会增加每个用户的点聚合。这个聚合可以保存在users表的一个单独的列中(如Oded所建议的那样)。
随着您的设计的进步,可能会出现可以预先计算的新的有用聚合。
但为了简单起见:只有在绝对必要时才使用这些聚合,例如计算用户的总点数需要太长时间。对于小型系统来说,实时计算这些总数确实不应该是一个问题。