2

我有两张桌子。

表 A:包含歌曲列表、歌曲插图、mp3 链接、标签等。

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

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

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

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

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

当然,使用这种方法,我将无法防止用户随意投票多次。

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

我希望我把这个要求说清楚了,如果没有,我很抱歉。

4

4 回答 4

3

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

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

于 2011-11-28T13:49:47.293 回答
1

尝试这个:

  • 专辑 | 艺术家ID,艺术品
  • 艺术家 | 综合评分
  • 歌曲 | 艺人ID、专辑、评分
  • 用户

这样你就可以按艺术家、歌曲、专辑等来拉。

于 2011-11-28T13:59:34.467 回答
1

取决于您希望评级的最新程度,对于星级评级,它不一定需要及时更新。所以你可以拥有

vote table: ([userID, songID], rating)

正如 Tom van der Woerdt 建议的那样,但您也可以为每首歌曲添加星级,并在有能力的情况下每天或每隔几个小时重新计算一次。

于 2011-11-28T14:00:26.593 回答
1

您的第三张表的结构应如下所示:

Song ID
User ID
Star Rating

- 在(歌曲 ID、用户 ID)上具有唯一索引。(您必须将歌曲 ID 和用户 ID 存储在一起才能知道谁投票 - 没有办法解决这个问题。)

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

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

在索引表上,为评分低于 1000 的特定歌曲选择平均值应该给出合理的访问时间。

于 2011-11-28T13:54:54.127 回答