我有两张桌子。
表A:包含歌曲,歌曲作品,mp3链接,标签等列表。
表B:包含注册用户信息,用户ID,用户名等。
我即将为歌曲添加星级评分系统,并希望任何注册用户每首歌只能投票一次。
所以我的计划最初是创建第三个表并使用JOIN:
表C:包含songID,总得分(所有投票的总和),vote_count(投票数),并在jQuery中执行计算客户端以返回平均投票。
我认为这对性能来说是最佳的,因为我将处理非常大的数据集。
当然,使用这种方法,我无法保护用户多次投票。
因此,我的问题是,什么数据库设置最好防止作弊(即存储和检查表C中的选民的userID)而不降低过滤/排序歌曲本身的性能,因为这是关键的项目
我希望我明确提出这个要求,如果不是,我道歉。
答案 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)
试试这个:
这样你就可以通过艺术家,歌曲,专辑等方式提升。
答案 3 :(得分:1)
取决于您希望评级的最新状态,对于星级评分,它不一定需要一分钟。
所以你可以拥有vote table: ([userID, songID], rating)
正如Tom van der Woerdt建议的那样,但你也可以为每首歌添加一个星级评分,并且如果你有能力,每天或每隔几小时重新计算一次。