評価はかなり静的であり、データセットが大きいため、ユーザーが映画を評価するときに、映画レコードのデータをキャッシュ(非正規化)できます。投票数と投票の合計を追跡する必要があるため、平均は正確です。映画のレーティングは、必要なときに動的に計算されます。スキーマは次のとおりです。
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 ;