代码之家  ›  专栏  ›  技术社区  ›  Faisal Abid

评级系统查询

  •  2
  • Faisal Abid  · 技术社区  · 14 年前

    我已经在MySQL中为电影建立了一个分级系统,但是我担心的是,当我的查询将所有分级相加并将其除以时,它可能需要将数百万条记录相加。

    1 回复  |  直到 11 年前
        1
  •  4
  •   Bohemian    14 年前

    由于分级是相当静态的,并且您的数据集很大,因此当用户对电影进行分级时,您可以在电影记录中缓存(非标准化)数据。你需要记录两张选票的数量和票数的总和,这样平均数才是准确的。您的电影分级是动态计算,当您需要它。以下是模式:

    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 ;