gpt4 book ai didi

sql - 存储/计算用户分数的最佳方式是什么?

转载 作者:可可西里 更新时间:2023-11-01 06:37:41 28 4
gpt4 key购买 nike

我想为一个网站设计一个数据库,用户可以通过执行某些事件获得积分(声誉),但我正在为数据库设计而苦苦挣扎。

我打算记录用户所做的事情,这样他们提交的项目可能会获得 25 分,他们发表的 30 条评论可能会获得 1 分,另外 10 分会因为表现出色而获得奖励!

很明显,所有数据都在那里,但要获得每个用户的总分似乎很多或需要查询,我想在他们的用户名旁边显示(以级别的形式)。例如,查询提交的项目表以获取该用户的每个项目的分数,查询评论表等。如果所有这些都需要为页面上提到的每个用户完成......查询很多!

我曾考虑在用户表中保留一个分数,这样查找起来似乎要快得多,但我一直被告知存储可以从其他数据计算的数据是不好的!

我见过很多网站做类似的事情(甚至堆栈溢出也做类似的事情)所以我认为必须遵循“最佳实践”。任何人都可以建议它可能是什么吗?

任何建议或评论都会很棒。谢谢!

最佳答案

我认为这绝对是一个很好的问题。我不得不构建具有与此类似行为的系统——尤其是当经常访问其中包含分数的表时(如在您的场景中)。这是我给你的建议:

首先,创建一些如下所示的表(我使用的是 SQL Server 最佳实践,但可以根据您认为合适的方式命名):

UserAccount          UserAchievement
-Guid (PK) -Guid (PK)
-FirstName -UserAccountGuid (FK)
-LastName -Name
-EmailAddress -Score

完成此操作后,继续创建如下所示的 View (不,我尚未验证此 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

我知道您提到过对性能和大量查询的一些担忧,但如果您构建这样的 View ,您将永远不需要多个查询。我建议不要将其作为物化 View ;相反,只需为您的表编制索引,以便您需要的查找(本质上是 UserAccountGuid)将启用跨表的快速求和。

我还要补充一点——如果您的 UserAccount 表变得很大,您可能会考虑一个稍微更智能的查询,它会包含您需要获取汇总的帐户名称。当您只在页面上显示 3-10 个用户的信息时,这将使您可以不向您的网站返回大量数据集。我必须多考虑一下如何优雅地执行此操作,但我建议不要使用“IN”语句,因为这会调用表的线性搜索。

关于sql - 存储/计算用户分数的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837257/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com