大型论坛数据库设计

[size=medium][color=indigo]http://www.iteye.com/topic/364016?page=5

ak478288:

简单用户表 tb_user:
userid , username

用户详细信息表 tb_userinfo
userid , email , homepage , phone , address

把用户信息分开的目的就是保证经常查询的数据在一张表,其它信息放到另一张表

论坛主题表 tb_bbs
bbsid , userid , title , ip , repleycount , replyuserid , createtime , lastreplytime

论坛内容标 tb_bbs_content (此表可按照bbsid进行分表存储)
bbsid , content;

论坛回复表 tb_bbs_reply (此表可按照bbsid进行分表存储)
replyid , bbsid , userid , content , replytime , ip


说说我设计的想法 :

论坛使用最多的功能为以下几个

一个话题列表页面,例如

select count(*) from tb_bbs; 查询数量,用来分页

select * from tb_bbs order by lastreplytime desc limit ?,?;

在列表中一般会显示发帖人的基本信息,例如username

在这里一般会使用以下的查询方式:

select * from tb_user u , tb_bbs b where u.userid=b.userid order by lastreplytime desc limit ?,?;

如果连表操作压力大的情况下,可以直接使用

select * from tb_bbs order by lastreplytime desc limit ?,?;

对于用户信心可以根据userid去缓存中取数据,这样避免的与tb_bbs表的关联查询


一个话题单页

对内容分表,可看具体情况而定,例如

bbsid是数字

bbs_content根据bbsid末位进行分表

分为
bbs_content0 ,
bbs_content1 ,
bbs_content2 ,
bbs_content3 ,
bbs_content4 ,
bbs_content5 ,
bbs_content6 ,
bbs_content7 ,
bbs_content8 ,
bbs_content9

tb_bbs_reply可以分为

tb_bbs_reply0 ,
tb_bbs_reply1 ,
tb_bbs_reply2 ,
tb_bbs_reply3 ,
tb_bbs_reply4 ,
tb_bbs_reply5 ,
tb_bbs_reply6 ,
tb_bbs_reply7 ,
tb_bbs_reply8 ,
tb_bbs_reply9 ,

例如bbsid=5687

select * from tb_bbs where bbsid=5687

//去缓存中取bbs_content相应内容,如果没有就根据算法

int tableIdx=modTable(5687);

//tableIdx=7

select * from tb_bbs_content7 where bbsid=5687;

select * from tb_bbs_reply7 where bbsid=5687 order by replyid asc limit ?,?

用户信息从缓存中取或者

select * from tb_bbs_reply7 r tb_user u,where bbsid=5687 adn r.userid=u.userid order by replyid asc limit ?,?

基本的使用场景是这个样子.

里面所有对于分表的思想就是,尽量让表文件大小达到最小化,


把内容与其它信息分开的好处就是可以让每个表的文件最小化,对数据库操作压力会减小.

这样保证每张表数据量很小,操作速度会快,而且可以搭配缓存,把内容根据情况进行缓存,可以尽量很少访问表数据

对于高访问量,不能只依赖于数据库,还要配合缓存的使用,我在上述例子中使用的缓存只是做法一种,也许还有更好的

对于上述分表方式也可以适用于分库操作,这样就降低了数据库单库的压力,把压力分散到各个机器

我的做法就是尽量避免表关联

再就是对于sql语句尽量都保证索引有效,不能索引的sql,尽量采用能索引的高效方式解决

有不妥的地方请指正



z494627:

提高速度的关键:
1.建立索引并在查询时充分利用;
2.避免使用关联,这样避免整表扫描;使用关联不如多次使用主键查询来的快;
3.一些处理的功能尽可能放到内存中来做,比如组织主题和回复;
4.使用静态页面也是个不错的做法;

///


jiyanliang 写道
JE的好像是两张表:主题表和回复表,而且定义了他们之间的关系,然后是使用了大量的缓存。缓存对于设计论坛系统还是有很大优势的。另外Robbin还说了,为了更好的使用缓存,还可以把回复的内容单独提取出来作为一个表。^_^

忘了是robbin是这样说的还是这样设计的。

这是延续了hibernate二级缓存的思想, 对于经常更新的数据都设计成单独表
这样可以最大程度的利用hibernate缓存

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zou274/archive/2009/04/18/4091036.aspx[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值