计算用户积分 - 更新与选择

时间:2014-11-26 15:13:39

标签: mysql performance sum database-performance

我的用户通过参与网站上的各种活动来获得积分,然后用户可以将这些积分用于他们喜欢的任何内容,我现在设置的方式是我有一张桌子 - tbl_users_achievements和tbl_users_purchased_items

我有这两个表来跟踪用户做了什么以及他们买了什么(显然!)

但是我没有在我的用户表中有一个名为'user_points'的列,我决定通过对所有成就执行SELECT并获得他们已经获得的点数的总和来显示他们的点,然后我做另一个选择他们花了多少分。

我认为最好有一个专栏来存储他们的积分,当他们购买东西并赢得东西时,我会对该用户的专栏进行更新,但这似乎是我必须管理的多个领域,我有为事务插入一个新行,然后更新他们的列,如果我使用一个查询来计算他们的总赢额 - 我只需要插入行并且不做更新。但问题是运行和使用查询进行计算的性能。

那么你会选择哪种解决方案?为什么?

  1. 有一个列来存储他们的积分并进行更新
  2. 使用查询计算出他们可以花费的用户点并且没有列

2 个答案:

答案 0 :(得分:0)

我自己,我会根据用户ID或其他任何内容将用户点放入一个单独的表格中,并将其存储在那里,并在达到成就或花费点数时进行更新或递减。

答案 1 :(得分:0)

您当前的模型在逻辑上是正确的 - RDBMS规范化的一个关键方面是不重复任何信息,并保持明确的“此客户有x点”列重复数据。

这样做的好处显而易见 - 您可以编写更少的数据操作代码,并且不必担心插入事务时会发生什么但无法更新users表。

缺点是每次显示客户资料时都会运行其他查询;这可能会造成性能问题。对该性能问题的传统响应是去标准化,例如通过将计算的总数保持在用户表上。

只有在绝对可行的情况下才这样做。