Php 一种高效的评级系统MySQL表结构

Php 一种高效的评级系统MySQL表结构,php,mysql,optimization,performance,project-planning,Php,Mysql,Optimization,Performance,Project Planning,这篇文章是这个问题的后续回答: 我采纳了cletus和Mehrdad Afshari关于使用规范化数据库方法的建议。是否正确设置了下表以进行适当的优化?我对MySQL的效率有点陌生,所以我想确保这是有效的 另外,当涉及到寻找游戏的平均评分和总投票数时,我应该分别使用以下两个查询吗 SELECT avg(vote) FROM votes WHERE uid = $uid AND gid = $gid; SELECT count(uid) FROM votes WHERE uid = $ui

这篇文章是这个问题的后续回答:

我采纳了cletus和Mehrdad Afshari关于使用规范化数据库方法的建议。是否正确设置了下表以进行适当的优化?我对MySQL的效率有点陌生,所以我想确保这是有效的

另外,当涉及到寻找游戏的平均评分和总投票数时,我应该分别使用以下两个查询吗

SELECT avg(vote) FROM votes WHERE uid = $uid AND gid = $gid;    
SELECT count(uid) FROM votes WHERE uid = $uid AND 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) NOT NULL,
  `gid` int(8) NOT NULL,
  `vote` int(1) NOT NULL,
  KEY `uid` (`uid`,`gid`)
) ;

到目前为止看起来不错。不要忘记索引和外键。根据我的经验,大多数问题并不是因为设计不够周密,而是因为缺少索引和外键

另外,关于存储引擎的选择,我还没有看到不使用innodb的原因(在一个相当复杂/大小的应用程序中),不仅仅是因为事务语义。

看起来不错


我会使用users_id&games_id而不是gid和uid,这听起来像是全局id和唯一id,游戏的平均投票数:
SELECT avg(vote),其中gid=$gid

游戏的投票数:
从gid=$gid的投票中选择count(uid)

由于您不会有任何小于
0
的用户或游戏ID,因此可以将其设置为无符号整数(
int(8)unsigned not NULL

如果要强制用户只能对游戏进行一次投票,请在
投票
表中的
uid
gid
上创建一个主键,而不仅仅是一个普通索引

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`)
) ;
主键字段的顺序(首先是
gid
,然后是
uid
)很重要,因此索引首先按
gid
排序。这使得索引对于具有给定的
gid
的选择特别有用。如果要选择给定用户的所有投票,请添加另一个仅包含
uid
的索引


我建议将InnoDB用于存储引擎,因为特别是在高负载设置中,表锁会破坏您的性能。对于读取性能,您可以使用APC、Memcached或其他工具实现缓存系统。

无论您最终做什么,都要确保使用大型数据集对其进行测试(即使您不打算拥有大量用户)


编写一个脚本,生成100000个游戏、50000个用户和一百万张选票。可能有点过多,但如果您的查询不需要花费数小时来处理这些项目,这将永远不会成为问题

您可能还需要添加一个
投票(DATETIME)列。这样,你就可以,比如说,在某个特定的时间跨度内看到游戏的趋势,或者万一有一天出现投票垃圾,你就可以准确地删除不需要的投票。

目前我没有使用MyISAM,也没有使用InnoDB。你会推荐使用InnoDB吗。