zoukankan      html  css  js  c++  java
  • 王老师好,学生请教个设计上的问题

    在著名开源论坛学习设计模式叫项目的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;
  • 相关阅读:
    IOS开发之控件(Ⅰ)
    Windows 8 Metro App开发[7]视图模型与数据绑定
    WP7/8退出程序
    Windows 8 Metro App开发[8]处理Fullscreen, Snapped和Filled状态
    【原创】WP7.8 ROM更新图文并茂
    Windows 8 Metro App开发[5]导航栏(AppBar)的使用
    Iphone开发准备工作
    20191302第十二章学习笔记
    实验四Web服务器2
    2.5 OpenEuler 中C与汇编的混合编程
  • 原文地址:https://www.cnblogs.com/dycg/p/1683238.html
Copyright © 2011-2022 走看看