我希望为一个网站设计一个数据库,用户可以通过该数据库获得执行某些活动的积分(声誉),并且正在努力应对数据库设计.
我打算保留用户所做事情的记录,这样他们可能会为他们提交的项目获得25分,每个他们所做的30条评论获得1分,还有10个奖励积分非常棒!
很明显,所有的数据都会存在,但似乎很多或者要查询每个用户的总得分,我想在他们的用户名旁边显示(以一个级别的形式).例如,对提交的项目表的查询以获取该用户的每个项目的分数,对评论表的查询等.如果需要对页面上提到的每个用户完成所有这些….大量的查询!
我曾经考虑过在用户表中保留一个分数,这看起来要快得多,但是我已经知道存储可以从其他数据计算的数据是很糟糕的!
我已经看到很多网站做类似的事情(甚至堆栈溢出也类似)所以我认为必须有一个“最佳实践”.任何人都可以建议它可能是什么?
任何建议或意见都会很棒.谢谢!
最佳答案
我认为这绝对是一个很好的问题.我必须构建具有类似行为的系统 – 特别是当经常访问具有分数的表时(如在您的场景中).这是我对你的建议:
原文链接:https://www.f2er.com/mysql/434225.html首先,创建一些如下所示的表(我使用的是sql Server最佳实践,但是如果您认为合适,请将它们命名):
UserAccount UserAchievement
-Guid (PK) -Guid (PK)
-FirstName -UserAccountGuid (FK)
-LastName -Name
-EmailAddress -score
完成此操作后,继续创建一个类似于以下内容的视图(不,我没有验证过这个sql,但它应该是一个好的开始):
SELECT [UserAccount].[FirstName] AS FirstName,[UserAccount].[LastName] AS LastName,SUM([UserAchievement].[score]) AS TotalPoints
FROM [UserAccount]
INNER JOIN [UserAchievement]
ON [UserAccount].[Guid] = [UserAchievement].[UserAccountGuid]
GROUP BY [UserAccount].[FirstName],[UserAccount].[LastName]
ORDER BY [UserAccount].[LastName] ASC
我知道你已经提到了一些关于性能和大量查询的问题,但是如果你构建一个这样的视图,你将不需要多个.我建议不要将其视为物化视图;相反,只需索引您的表,以便您需要的查找(实际上是UserAccountGuid)将实现表中的快速求和.
我将再添加一点 – 如果您的UserAccount表变得庞大,您可以考虑一个稍微更智能的查询,其中包含您需要进行汇总的帐户名称.这样,当您只在页面上显示3-10个用户的信息时,就不会将大量数据集返回到您的网站.我不得不考虑更多关于如何优雅地做到这一点,但我建议远离“IN”语句,因为这将调用表的线性搜索.