评价表设计 mysql_5星评分系统数据库表结构如何设计更高效?

针对5星评分系统,目前的数据库设计包括games、users和votes表。考虑在数据量增大时提高效率,可以考虑将平均评分和各星数投票次数存储在games表中,避免每次查询时计算。同时,可添加唯一约束防止用户重复投票。
摘要由CSDN通过智能技术生成

我们常见给产品进行5星评价的系统,我初步的构想如下,

SELECT avg(vote) FROM votes WHERE gid = $gid;

SELECT count(uid) FROM votes WHERE gid = $gid;

CREATE TABLE IF NOT EXISTS `games` (

`id` int(8) NOT NULL auto_increment,

`title` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `users` (

`id` int(8) NOT NULL auto_increment,

`username` varchar(20) NOT NULL,

PRIMARY KEY (`id`)

) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `votes` (

`uid` int(8) unsigned NOT NULL,

`gid` int(8) unsigned NOT NULL,

`vote` int(1) NOT NULL,

PRIMARY KEY (`gid`, `uid`)

) ;

如何修改更高效?

例如,

当数据上万时,把平均值存储下来,而不是每次都进行计算?

在games表中进行适当的冗余,增加一个评论加1?

我现在有点拿不定主意。

CREATE TABLE IF NOT EXISTS `games` (

`id` int(8) NOT NULL auto_increment,

`title` varchar(50) NOT NULL,

`vote_1` int(8) unsigned NOT NULL,

`vote_2` int(8) unsigned NOT NULL,

`vote_3` int(8) unsigned NOT NULL,

`vote_4` int(8) unsigned NOT NULL,

`vote_5` int(8) unsigned NOT NULL,

`avgrate` int(8) unsigned NOT NULL,

PRIMARY KEY (`id`)

) AUTO_INCREMENT=1 ;

现在一般不都是 评分总分/评分次数 么? 其他的再加上防止用户重复投票就是了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值