如何有效地存储星级或用户投票等反馈?

时间:2019-02-07 11:10:15

标签: database algorithm

我正在制作一个类似于Play商店星级评分系统的系统,该产品或实体由多个用户提供评分和评论,并为每个实体显示平均评分。

但是问题是,我是否应在每个实体的数据库中存储评级,并列出对其进行评级和给定评级的用户列表,但这将使用户难以检查他对哪些实体进行了评级,因为我们需要检查每个实体是否存在用户,

或者,我应该将具有评分的每个实体存储在用户数据库中,但这会使实体的呈现更加困难

所以,有没有一种简单有效的方法可以完成它

或者在两个数据库中高效地存储相同的数据,我还在stackoverflow中找到了该系统的一个示例,当存储问题的上下表决权时,给+5赞成票,而对问题的反对票给+5。用户,这意味着他们肯定需要将每个上下投票都存储在问题数据库中,但是当用户打开问题时,他可以看到他的投票,因此该投票将存储在用户的数据库中

感谢帮助

2 个答案:

答案 0 :(得分:1)

我确实至少会存储“原始”版本,所以要有一个大表来存储productid / entityid,userid和rating。您可以直接从该表查询以获得所需的任何结果。基于此,您还可以根据需要计算(或重新计算)预测,因此可以安全地将其存储为真相。

您可以从简单的聚合查询开始,只要它足够快即可,但是为了对其进行优化,您可以采用其他格式对数据进行预测,例如每个产品的平均评论得分。可以使用(实例化)视图来实现此目的,也可以在投票时单独存储汇总评分。

更新计划的汇总也非常轻巧,因为您可以存储实体的平均评分以及投票数。因此,当您更新评分时,您可以:

NewAverage = (AverageRating * NumberOfRatings + NewRating) / (NumberOfRatings + 1)

此后,您将存储新的评分平均值和增量。因此,无论何时有人投票,都无需再次进行完全汇总,而且您也可以获得跟踪票数的额外好处,这通常也显示在网站上。

答案 1 :(得分:1)

最简单的方法是创建一个包含用户和产品的查看表。因此您的数据库应如下所示。

产品
       --id
       --name
       -价格

用户
       --id
       -名字
       --lastname

评论
       --id
       --userId
       --productId
       -投票

然后,如果您希望获得用户对某个产品的所有评论,则只需查询 审查表。希望这能解决您的问题?