分析论坛数据库设计&分析

1,数据库设计

论坛数据库设计还是挺有意思的,按照业务逻辑进行拆分的数据库设计。
首先,如果是一个博客就一个post表记可以了。然后考虑到论坛数据量比较大,所以在设计上有优化。
论坛把数据库分成3个数据表,这样在访问不同页面的时候都查询很快。
数据库表参考discuz 数据库设计:
只是挑了些相关字段,没有把所有字段列出了。

--论坛板块表
CREATE TABLE forum (
  fid mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(50) NOT NULL DEFAULT '',
  `status` tinyint(1) NOT NULL DEFAULT '0',

  threads mediumint(8) unsigned NOT NULL DEFAULT '0',
  posts mediumint(8) unsigned NOT NULL DEFAULT '0',
  todayposts mediumint(8) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (fid)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

--论坛帖子
CREATE TABLE `thread` (
  `tid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `fid` mediumint(8) unsigned NOT NULL DEFAULT '0',

  `author` char(15) NOT NULL DEFAULT '',
  `authorid` mediumint(8) unsigned NOT NULL DEFAULT '0',

  `subject` char(80) NOT NULL DEFAULT '',
  `dateline` int(10) unsigned NOT NULL DEFAULT '0',

  `views` int(10) unsigned NOT NULL DEFAULT '0',
  `replies` mediumint(8) unsigned NOT NULL DEFAULT '0',

  `attachment` tinyint(1) NOT NULL DEFAULT '0',

  `closed` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `status` smallint(6) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--论坛帖子内容
CREATE TABLE post (
  pid int(10) unsigned NOT NULL AUTO_INCREMENT,
  fid mediumint(8) unsigned NOT NULL DEFAULT '0',
  tid mediumint(8) unsigned NOT NULL DEFAULT '0',
  `first` tinyint(1) NOT NULL DEFAULT '0',

  author varchar(15) NOT NULL DEFAULT '',
  authorid mediumint(8) unsigned NOT NULL DEFAULT '0',

  `subject` varchar(80) NOT NULL DEFAULT '',
  dateline int(10) unsigned NOT NULL DEFAULT '0',

  message mediumtext NOT NULL,
  useip varchar(15) NOT NULL DEFAULT ''

  PRIMARY KEY (tid,pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2,具体分析

从页面来分析,按照用户访问路径分析。
首先用户访问论坛主页,这个地方会直接查询forum表。
里面保存了论坛板块信息,主题数量,帖子数量。

比如一个骑行网站论坛:http://www.517318.com/ (随便找的)

考虑到效率,在forum表中存储了一些冗余信息,计数的信息直接记录到了这张表里面。

然后进入主题页面

这里查询了下thread表,thread表也做了数据冗余。
当用户发帖的适合会创建一个thread表,只存标题数量,再创建一个post表,post里具体的内容。

如果是发帖,则thread表和post表都插入数据。
如果是回帖,则只记录post表同时,同时记录thread id。
只有第一个是发帖,其他的都是回帖。

3,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47343257 未经博主允许不得转载。

论坛数据库设计通过3张表,分开放不同数据,得到3种页面查询速度都很快。
这对于我们的系统设计很有启发,类似的情况还有博客数据库设计。
把博客的标题存成一张表,博客的内容存成一张表,数据分开后,两种情况查询都得到优化。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
BBS论坛系统数据库设计 0.后台用户管理(TAB_USER) "序号 "字段名称 "字段英文名 "数据类型"长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "自增ID "id "int " "Y "N " " "2 "用户帐号 "usercode "varchar "20 " "N "登录用 " "3 "姓名 "username "varchar "20 " "N " " "3 "密 码 "pwd "varchar "11 " "N "用MD5加" " " " " " " " "密算法 " "4 "性别 "ssex "varchar "10 " " " " "5 "角色 "role "int " " " " " "6 "Email地址"email "varchar "30 " " " " " " 1.前台用户注册表(TAB_USER_REGISTER) "序号 "字段名称 "字段英文名 "数据类型"长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "自增ID "id "int " "Y "N " " "2 "用户帐号 "usercode "varchar "50 " "N "登录用 " "3 "姓名 "username "varchar "50 " "N " " "3 "密 码 "userpsw "varchar "11 " "N "用MD5加" " " " " " " " "密算法 " "4 "昵称 "nickname "varchar "50 " " " " "5 "头像 "image " " " " " " "6 "Email地址"email "varchar "80 " " " " "7 "验证码 "checkno "bigint "10 " " " " " " 用户发帖表(TAB_USER_SENDCARD) "序号 "字段名称 "字段英文名 "数据类型 "长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "发帖ID "sendcardid "int " "Y "N "自增 " "2 "发帖区ID "sendzoneid "int " " " "参照发 " " " " " " " " "帖区 " "3 "用户帐号 "usercode "varchar "30 " " " " "4 "主题 "title "varchar "200 " "N " " "5 "发帖内容 "cardcontent "varchar "1000" " " " "6 "日期 "date "date " " " " " "7 "验证码 "checkno "bigint " " " " " "发帖ID的值来判断级别。 " 用户跟帖表(TAB_USER_FOLLOWCARD) "序号 "字段名称 "字段英文名 "数据类型"长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "跟帖ID "followcardid "int " "Y "N "自增 " "2 "讨论区ID "discussid "int " " " "参照推 " " " " " " " " "荐讨论 " " " " " " " " "区ID和 " " " " " " " " "技术讨 " " " " " " " " "论区ID " "3 "用户帐号 "usercode "varchar "30 " " " " "4 "发帖ID "sendcardid "int " " " "参照发 " " " " " " " " "帖表sen" " " " " " " " "dcardID" " " " " " " " "(1:n " " " " " " " " ") " "5 "跟帖内容 "followcardconte"varchar "1000" " " " " " "nt " " " " " " "6 "日期 "date "date " " " " " "7 "验证码 "checkno " " " " " " " " 公告管理表(TAB_NOTICEMANAGE ) "序号 "字段名称 "字段英文名 "数据类型"长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "公告ID "noticeid "int " "Y "N "自增 " "2 "公告时间 "noticetime "date " " " " " "3 "公告内容 "content "varchar "200 " "N " " "4 "作者 "author "varchar "50 " " " " "5 "备注 "remark "varchar "100 " " " " " " 推荐讨论区表(TAB_RECOMMANDMANAGE) "序号 "字段名称 "字段英文名 "数据 "长度"PK(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值