我感谢您提供的任何帮助 - 我目前正在尝试为使用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
答案 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上的投票一样。