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

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-07-24
  • 2021-07-11
  • 2022-01-10
  • 2022-12-23
  • 2021-09-30
  • 2021-05-15
  • 2021-12-25
  • 2022-12-23
猜你喜欢
  • 2021-05-01
  • 2021-08-20
  • 2022-01-07
  • 2021-11-14
  • 2022-01-23
  • 2021-08-07
相关资源
相似解决方案