我希望为一个网站设计一个数据库,用户可以通过该数据库获得执行某些活动的积分(声誉),并且正在努力应对数据库设计.
我打算保留用户所做事情的记录,这样他们可能会为他们提交的项目获得25分,每个他们所做的30条评论获得1分,还有10个奖励积分非常棒!
很明显,所有的数据都会存在,但似乎很多或者要查询每个用户的总得分,我想在他们的用户名旁边显示(以一个级别的形式).例如,对提交的项目表的查询以获取该用户的每个项目的分数,对评论表的查询等.如果需要对页面上提到的每个用户完成所有这些….大量的查询!
我曾经考虑过在用户表中保留一个分数,这看起来要快得多,但是我已经知道存储可以从其他数据计算的数据是很糟糕的!
我已经看到很多网站做类似的事情(甚至堆栈溢出也类似)所以我认为必须有一个“最佳实践”.任何人都可以建议它可能是什么?
任何建议或意见都会很棒.谢谢!
最佳答案我认为这绝对是一个很好的问题.我必须构建具有类似行为的系统 – 特别是当经常访问具有分数的表时(如在您的场景中).这是我对你的建议:首先,创建一些如下所示的表(我使用的是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 TotalPointsFROM [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”语句,因为这将调用表的线性搜索.
总结以上是内存溢出为你收集整理的sql – 存储/计算用户分数的最佳方法是什么?全部内容,希望文章能够帮你解决sql – 存储/计算用户分数的最佳方法是什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)