在著名开源论坛学习设计模式叫项目的yazd论坛 http://www.forumsoftware.ca/
他里面有三个表,分别是论坛表(forum),主题表(forumThread),帖子表(forumMessge)
表结构见文章最下方.
我的问题是:
yazd论坛中,主要要显示论坛, 如下
表1
论坛名 主题数 帖子数 最后更新
--------------------------------------------
论坛A 87 1023 某某帖子
论坛B 117 2023 某某帖子
论坛C 87 1023 某某帖子
表2
在主题页面也是类似的布局
主题名 回帖数 浏览数 最后更新
--------------------------------------------
主题A 87 1023 某某用户
主题B 117 2023 某某用户
主题C 87 1023 某某用户
我的疑惑是
按照表结构和代码来看,论坛的主题数和回帖数是要经过两条 select count(*) sql 语句.
主题表也一样,回帖数也要通过在message表中select count(*)才能得到.
这在论坛,主题数目少的情况下是没问题,表1要3*2+1条sql语句,表2要3*1+1条sql语句
但是我如果首页有10个论坛,主题页每页显示100条主题,那访问一次这样的页面需要执行上百条sql,而且论坛每秒不止一个用户访问
如果说是缓存,select count(*) 的结果应该没的缓存吧?因为主题和回帖数时时更新,缓存没什么意义吧??
可是,这个论坛的性能却很好(官网,以及网友评价),不知道为什么,所以向王老师请教.
那单条sql语句,也就是用了很多left join语句的也能实现这个效果,性能会比上述情况好吗?
如果是软件设计上的不足,那该数据表该如何设计呢??
若在forum上加上主题数,帖子数字段的话,那么forum将时时更新,不利于缓存
这个问题困扰了我很久,希望王老师能耐心帮学生解答下.谢谢了!!
附录
yazdForum
forumThread
forumMesage
对应sql代码:
CREATE TABLE `yazdforum` (
`forumID` int(11) NOT NULL,
`name` varchar(255) collate utf8_bin default NULL,
`description` text collate utf8_bin,
`modifiedDate` varchar(15) collate utf8_bin default NULL,
`creationDate` varchar(15) collate utf8_bin default NULL,
`moderated` int(11) NOT NULL,
`forumGroupID` int(11) NOT NULL,
`article` int(11) NOT NULL,
`forumorder` int(11) default NULL,
PRIMARY KEY (`forumID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `yazdthread` (
`threadID` int(11) NOT NULL,
`forumID` int(11) NOT NULL,
`rootMessageID` int(11) NOT NULL,
`approved` int(11) NOT NULL,
`readcnt` int(11) NOT NULL,
`typeID` int(11) NOT NULL,
`sticky` int(11) NOT NULL,
`closedflag` int(11) NOT NULL,
`creationDate` varchar(15) collate utf8_bin NOT NULL,
`modifiedDate` varchar(15) collate utf8_bin NOT NULL,
PRIMARY KEY (`threadID`),
KEY `forumID` (`forumID`),
KEY `rootMessageID` (`rootMessageID`),
KEY `creationDate` (`creationDate`),
KEY `modifiedDate` (`modifiedDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `yazdmessage` (
`messageID` int(11) NOT NULL,
`threadID` int(11) NOT NULL default '-1',
`subject` varchar(255) collate utf8_bin default NULL,
`userID` int(11) NOT NULL,
`body` text collate utf8_bin,
`modifiedDate` varchar(15) collate utf8_bin NOT NULL,
`creationDate` varchar(15) collate utf8_bin NOT NULL,
`approved` int(11) NOT NULL,
`ranking` int(11) default NULL,
`replyPrivateUserId` int(11) NOT NULL default '0',
PRIMARY KEY (`messageID`),
KEY `userID` (`userID`),
KEY `threadID` (`threadID`),
KEY `approved` (`approved`),
KEY `creationDate` (`creationDate`),
KEY `modifiedDate` (`modifiedDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;