1

在我的一个网站上,用户可以互相投票。我有一个Votes表格,其中每一行对应于给定的投票。

我想开始向用户展示他们的总票数,这只是他们在该Votes表中获得的票数的总和。我应该实时计算,还是应该每天计算一次。这种情况的“最佳实践”是什么(假设有数十万票并且还在增长)?

实时很容易,但一天一次就没有那么简单了。我假设我需要做一个 Cron 作业,但我到底该怎么做呢?我知道我需要遍历每个用户并计算他们在该Votes表中收到的投票的总和,但是我是否需要从第一次投票开始每天都计算一个完整的总和并保存它,或者我应该仅将投票(自上次更新以来)添加到现有总和并保存?

如果是后者,那么我将如何做到这一点并跟踪所有内容,以便不会错过任何选票或添加两次?

4

1 回答 1

1

处理这个问题的标准方法是去规范化,这基本上意味着存储可以由查询确定的数据。它不仅是唯一真正可扩展的解决方案,而且相当简单且性能卓越。下面是你如何实现它:

向表中添加一total_votesusers并通过在投票数据更改时触发的触发器保持正确。

像这样的东西:

delimiter //

create trigger vote_trigger
after insert on votes
for each row
begin
    update users set
    total_votes = total_votes + 1
    where users.user_id = new.user_id;
end; //

delimiter ;

为行删除和行更新创建其他类似的触发器。


最初,运行查询以填充所有值,这样的事情只在系统离线或处于只读模式时运行一次:

update users set
total_votes = (select count(*) from votes where user_id = users.user_id);

但执行此查询时,触发器将保持total_votes正确的值(即与votes表同步)。

于 2012-09-12T18:44:59.857 回答