由于分级是相当静态的,并且您的数据集很大,因此当用户对电影进行分级时,您可以在电影记录中缓存(非标准化)数据。你需要记录两张选票的数量和票数的总和,这样平均数才是准确的。您的电影分级是动态计算,当您需要它。以下是模式:
create table movie as (
movie_id int not null primary key,
-- your current columns
vote_count int,
vote_sum int
);
然后使用视图来帮助解决问题
create view movie_view as
select
*,
vote_sum/vote_count as vote_average
from movie;
假设您有一个如下所示的表:
create table user_movie_vote (
user_id int references user,
movie_id int references movie,
vote int
);
您可以使用触发器为自己更新投票总数:
delimiter ~
create trigger movie_vote_trg after insert on user_movie_vote
for each row
begin
update movie set
vote_count = vote_count + 1,
vote_sum = vote_sum + new.vote
where movie_id = new.movie_id;
end~
delimiter ;
如果可以更新投票,您将需要:
delimiter ~
create trigger movie_vote_trg after update on user_movie_vote
for each row
begin
update movie set
vote_sum = vote_sum + new.vote - old.vote
where movie_id = new.movie_id;
end~
delimiter ;
delimiter ~
create trigger movie_vote_trg after delete on user_movie_vote
for each row
begin
update movie set
vote_sum = vote_sum - old.vote,
vote_count = vote_count - 1
where movie_id = new.movie_id;
end~
delimiter ;