2012-07-30 46 views
0

我正在为我公司的投票系统工作,在这个系统中,每个用户都可以投一个或多个主题。在话题中投票会导致此主题在声誉上获得+1,而其他所有主题在声誉中损失-1。 (这些数字是相当随意的,真正的价值是一个复杂的公式)。影响数据库中所有项目的用户操作,以及如何有效地处理它们?

我想构建我的数据库创建一个视图,我将存储每个主题的ID,该主题的总投票数,其他主题的总投票数和计算出的信誉。

我的问题是关于性能/可伸缩性。我认为这个解决方案并不是非常有效,因为如果我有100个主题,每秒2张选票,我将不得不每秒刷新所有主题的所有值,即每秒总共200条记录。

这种分析是否正确? mssql引擎是否会轻松处理它?或者我应该寻找其他方法?你有什么建议?

感谢, 奥斯卡

回答

2

这将是非常困难的数据库。

你的公式依赖于什么变量?如果您加入和减去的金额在某种程度上是全球性的,那么您可以跟踪它们,并且只在需要显示时才计算每个主题的分数。

例如,您可以只增加一个主题的分数,但还会增加一个全局变量,以跟踪总共有多少“upvotes”。这样当你想显示任何主题的分数时,你就可以在不用轰炸数据库的情况下即时计算它。

有关配方的更多信息可以为您提供更好的建议。

编辑:

你有这样的公式:

origninalRep + (upvotes*10 - otherVotes) 

你可以得到originalRep有一个查询简单。

upvotes相同。

“棘手”的部分将是otherVotes。但那只是globalVotesCount - upvotes,如果你跟踪全球upvotes计数,你就有这些。

我希望这会有所帮助。

+0

该公式只考虑原始声誉,upvotes和其他主题upvotes。 Smt是这样的:origninalRep +(upvotes * 10 - otherVotes) – JSBach 2012-07-30 15:59:39

+0

嗨!这有帮助,当然:)谢谢。但是,如果我想获得最新的声誉,那么这需要我击中数据库才能获得upvotes和globalVotesCount的每个计算结果,对吧? (只是检查,看看我是否理解了所有的想法或错过了什么)。我会首先使用缓存,如果需要的话,我会创建一个3秒缓存或smt这样的值。你怎么看? – JSBach 2012-07-31 16:49:11

+1

对不起,对于迟到的回复,但是是的,您必须为每个upvote/downvote计数打到DB。这是正常的程序,这就是为什么你有缓存。像Ruby和Python这样的语言会自动缓存你的结果,否则你可以自己实现一个。 – 2012-08-01 10:17:17

相关问题