星级评级的最佳MySQL数据库设置

时间:2011-11-28 13:48:06

标签: mysql database rating-system

我有两张桌子。

表A:包含歌曲,歌曲作品,mp3链接,标签等列表。

表B:包含注册用户信息,用户ID,用户名等。

我即将为歌曲添加星级评分系统,并希望任何注册用户每首歌只能投票一次。

所以我的计划最初是创建第三个表并使用JOIN:

表C:包含songID,总得分(所有投票的总和),vote_count(投票数),并在jQuery中执行计算客户端以返回平均投票。

我认为这对性能来说是最佳的,因为我将处理非常大的数据集。

当然,使用这种方法,我无法保护用户多次投票。

因此,我的问题是,什么数据库设置最好防止作弊(即存储和检查表C中的选民的userID)而不降低过滤/排序歌曲本身的性能,因为这是关键的项目

我希望我明确提出这个要求,如果不是,我道歉。

4 个答案:

答案 0 :(得分:3)

制作投票表:([userID,songID],评级)

也许在songID上放一个索引以便更快地访问。

答案 1 :(得分:1)

你的第三张桌子的结构应该是:

Song ID
User ID
Star Rating

- 具有唯一索引(歌曲ID,用户ID)。 (你必须将歌曲ID和用户ID存储在一起,以便能够告诉谁投票 - 没有办法解决这个问题。)

要返回给定歌曲的平均评分,只需

select AVG(`Star Rating`) From `Rating Table` where `Song ID` = ?

在索引表格中,选择低于1000等级的特定歌曲的平均值应该会给出合理的访问时间。

答案 2 :(得分:1)

试试这个:

  • 专辑|艺术家ID,艺术品
  • 艺术家|整体评价
  • 宋|艺人ID,专辑,评级
  • 用户

这样你就可以通过艺术家,歌曲,专辑等方式提升。

答案 3 :(得分:1)

取决于您希望评级的最新状态,对于星级评分,它不一定需要一分钟。

所以你可以拥有

vote table: ([userID, songID], rating)
正如Tom van der Woerdt建议的那样,但你也可以为每首歌添加一个星级评分,并且如果你有能力,每天或每隔几小时重新计算一次。