如何优化我的投票应用程序以生成月度图表?

时间:2011-04-01 08:47:40

标签: sql voting

我感谢您提供的任何帮助 - 我目前正在尝试为使用PHP / MySQL构建的投票应用程序决定架构,但我完全陷入困境如何优化它。关键要素是每个项目每个用户只允许一次投票,并能够根据当月收到的投票建立一个详细说明当月最佳项目的图表。

到目前为止,最初的架构是:

Items_table
 item_id
 total_points
 (lots of other fields unrelated to voting)

Voting_table
 voting_id
 item_id
 user_id
 vote (1 = up; 0 = down)
 month_cast
 year_cast

所以我想知道它是否会从投票表中选择所有信息,其中month = currentMonth& year = currentYear,以某种方式按item_id运行计数和分组;如果是的话,我该怎么做呢?或者我最好为月度图表创建一个单独的表格,每个表格都会更新,但是我应该关注每次投票更新3个数据库表格的要求吗?

我不是特别称职 - 如果它显示 - 所以真的很喜欢任何人可以提供的帮助/指导。

谢谢,

_just_me

2 个答案:

答案 0 :(得分:0)

我不会为月度图表添加单独的表格;为防止用户为每个项目投放多个投票,您可以在voting_table(item_id,user_id)上使用唯一键。 至于摘要,您应该能够使用像

这样的简单查询
select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year

答案 1 :(得分:0)

我会使用类似的投票表:

create table votes(
  item_id
 ,user_id
 ,vote_dtm
 ,vote
 ,primary key(item_id, user_id)
 ,foreign key(item_id) references item(item_id)
 ,foreign key(user_id) references users(user_id)
)Engine=InnoDB;

在innodb表上使用复合键会聚集项目周围的数据,从而更快地找到与项目相关的投票。我添加了一列vote_dtm,用于保存用户投票时的时间戳。

然后我会创建一个或多个视图,用于报告目的。

create view votes_monthly as
select item_id
      ,year(vote_dtm)  as year
      ,month(vote_dtm) as month
      ,sum(vote) as score
      ,count(*)  as num_votes
  from votes
 group
    by item_id
      ,year(vote_dtm)
      ,month(vote_dtm);

如果您遇到性能问题,可以使用包含预先计算值的表替换视图,而无需触及报告代码。

请注意,我同时使用了count(*)sum(vote)。计数(*)将返回投票数,而总和将返回投票数。但是,如果您将vote列更改为使用+1表示upvotes而-1表示downvotes,则总和(投票)将返回一个得分,就像计算stackoverflow上的投票一样。