天天看点

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

1,数据库设计

论坛数据库设计还是挺有意思的,按照业务逻辑进行拆分的数据库设计。

首先,如果是一个博客就一个post表记可以了。然后考虑到论坛数据量比较大,所以在设计上有优化。

论坛把数据库分成3个数据表,这样在访问不同页面的时候都查询很快。

数据库表参考discuz 数据库设计:

只是挑了些相关字段,没有把所有字段列出了。

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

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

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

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

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

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

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

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

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

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

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

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

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

  message mediumtext NOT NULL,
  useip varchar() 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种页面查询速度都很快。

这对于我们的系统设计很有启发,类似的情况还有博客数据库设计。

把博客的标题存成一张表,博客的内容存成一张表,数据分开后,两种情况查询都得到优化。