0

感谢您提供的任何帮助 - 我目前正在尝试为我正在使用 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

所以我想知道是否会从投票表中选择所有信息,其中月份 = currentMonth & year = currentYear,以某种方式运行计数并按 item_id 分组;如果是这样,我将如何去做?或者我会更好地为每个投票更新的月度图表创建一个单独的表,但是我应该关心每次投票更新 3 个数据库表的要求吗?

我不是特别称职——如果它表明的话——所以我真的很喜欢有人可以提供的任何帮助/指导。

谢谢,

_只有我

4

2 回答 2

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)。count(*) 将返回投票数,而 sum 将返回赞成票数。但是,如果您将vote列更改为使用 +1 表示赞成票,使用 -1 表示反对票,则 sum(vote) 将返回一个分数,就像计算 stackoverflow 上的投票一样。

于 2011-04-01T19:14:54.610 回答
0

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

select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year
于 2011-04-01T08:55:51.333 回答