mysql - 计算用户点 - 更新与选择

标签 mysql performance sum database-performance

我有一些用户通过参加网站上的各种事件来赚取积分,然后用户可以将这些积分花在他们喜欢的任何事情上,我目前设置的方式是我有一张 table - tbl_users_achievements 和 tbl_users_purchased_items

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

但是,我没有在我的用户表中有一列名为“user_points”的列,而是决定通过对所有成就进行 SELECT 并获取他们获得的积分总和来显示他们的积分,然后我在他们花费了多少积分。

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

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

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

最佳答案

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

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

缺点是每次显示客户资料时都会运行额外的查询;这可能会产生性能问题。对该性能问题的传统响应是反规范化,例如根据用户表保留计算出的总数。

只有在绝对有必要时才这样做。

关于mysql - 计算用户点 - 更新与选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152608/

相关文章:

mysql - 为什么安装成功后在gem list下没有出现mysql?

php - Symfony 和 CakePHP 是否太慢而无法使用?

performance - VBA 循环效率

MySQL 复杂的 SQL 查询需要 2 列来提供基于另一列的值的 SUM 总计(如果 = 是),同时分组在一起

php - 多个数据库,或始终限制查询

mysql - 子查询的外部查询非常慢(Mysql)

mysql - SQL:无法删除或更新父行:外键约束失败

安卓颜色,最快?

python - 如何在Python中通过多个键聚合数据集?

javascript - javascript中输入的总和