Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
星级最佳MySQL数据库设置_Mysql_Database_Rating System - Fatal编程技术网

星级最佳MySQL数据库设置

星级最佳MySQL数据库设置,mysql,database,rating-system,Mysql,Database,Rating System,我有两张桌子 表A:包含歌曲、歌曲艺术品、mp3链接、标签等的列表 表B:包含注册用户信息、用户id、用户名等 我将为歌曲添加一个明星评级系统,并希望每个歌曲只允许注册用户投票一次 因此,我最初的计划是创建第三个表并使用联接: 表C:包含songID、总分(所有投票的总和)、投票计数(投票数),并在jQuery中执行计算客户端以返回平均投票数 我认为这对于性能来说是最佳的,因为我将处理非常大的数据集 当然,如果使用这种方法,我将无法防止用户随意多次投票 因此,我的问题是,设置什么样的数据库最能防

我有两张桌子

表A:包含歌曲、歌曲艺术品、mp3链接、标签等的列表

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

我将为歌曲添加一个明星评级系统,并希望每个歌曲只允许注册用户投票一次

因此,我最初的计划是创建第三个表并使用联接:

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

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

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

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

我希望我能把这个要求说清楚,否则我深表歉意。

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


可能会在songID上添加索引,以加快访问速度。

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

Song ID
User ID
Star Rating
-打开唯一索引(歌曲ID、用户ID)。(你必须将歌曲ID和用户ID存储在一起才能知道谁投了票——这是没有办法的。)

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

select AVG(`Star Rating`) From `Rating Table` where `Song ID` = ?
在索引表中,为评级低于1000的特定歌曲选择一个平均值应该可以提供合理的访问时间。

尝试以下方法:

  • 专辑|艺术家id、艺术品
  • 艺术家|整体评级
  • 歌曲|艺术家id、专辑、评级
  • 使用者

通过这种方式,你可以根据艺术家、歌曲、专辑等进行排名。

取决于你想要的最新排名,对于明星排名,不一定需要最新排名。这样你就可以拥有

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

正如Tom van der Woerdt所建议的,但你也可以为每首歌添加一个星级,每天或每隔几个小时重新计算一次,如果你有能力的话。

谢谢Tom,这很好,不过这是我的第一个想法。让我们假设一个500000首歌曲的数据集,每首歌曲有400-1000张选票。在这种情况下,使用这样一种简单的存储方法,查询性能是否会达到最佳,或者我还应该做些什么?如果发生这种情况,您可能应该在应用程序中添加一个Memcache层,因此,这些查询每x分钟只需执行一次,Memcache服务器只需增加内存中的值。就你所说的规模而言,你不想使用MySQL来做这类事情——而是使用缓存服务器,MySQL作为后备。我个人会使用这样一个表,来跟踪哪个用户对什么投票,以及两个额外的列,其中包含星星和投票总数,以缓存数据,以便更快地访问(你可以简单地
选择stars\u count/vote\u count作为avg\u启动
,然后
更新..设置vote\u count=vote\u count+1,stars\u count=stars\u count+[用户投票]
除了插入投票表之外[可能作为触发器,而不是在应用程序本身中])。这是一个缓存,不属于数据库。简单的缓存服务器,如memcached,速度要快得多。多亏了Tom,memcached已经就位了……我想进一步优化意味着要迁移到InnoDB或类似的规模。我对数据库缓存机制的了解很少,所以我想这也是一个很好的解决方案是时候学习了。感谢所有回答的人,我想答案真的和我想的一样简单。汤姆也回答了我的评论。向其他回答基本相同的人道歉。感谢你们直接抄袭我:-)无意冒犯,我现在直接表扬了你,并对你的答案投了更高的票。谢谢马克,尤其是你回答了这个问题。尽管你给出了同样的答案,我还是把它授予了汤姆,因为他回答了我关于绩效和规模的持续问题。希望没问题。尝试以下方法。image\u投票表使用集群复合主键(image\u id,user\u id),因此查找速度非常快这对f00有很大帮助。。。非常感谢。:-)