王老师好,学生请教个设计上的问题

在著名开源论坛学习设计模式叫项目的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;

 

 

 

 

 

 

 

 

 

 

posted @ 2010-03-11 10:50  东苑草根  阅读(300)  评论(1编辑  收藏  举报
手牵手 一步两步三步 往上爬