大型论坛数据库设计

http://www.javaeye.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缓存 

你可能感兴趣的:(数据库)