大型论坛数据库设计

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缓存 

第一章 需求分析 1.1 BBS的功能与应用需求 1.1.1论坛的功能 论坛是Internet上的一种电子信息服务系统。它提供一块公共电子白板,每个用户都 可以在上面书写,可发布信息或提出看法。它是一种交互性强,内容丰富而即使的电子 信息服务系统。用户在论坛站点上可以获得各种信息服务、发布信息、进行讨论、聊天 等等。像日常生活中的黑板报一样,论坛按不同的主题分为许多版块,版面的设立依据 是大多数拥护的要求和喜好,用户可以阅读别人关于某个主题的看法,也可以将自己的 想法毫无保留地帖到论坛中。 随着计算机网络技术的不断发展,论坛的功能越来越强大,目前论坛的主要功能有以 下几点: (1) 供用户自我选择阅读若干感兴趣的专业组和讨论组内的信息。 (2) 可随意检查是否有新消息发布并选择阅读。 (3) 用户可在站点内发布消息或文章供他人查阅。 (4) 用户可就站点内其他人的消息或文章进行评论。 (5) 同一站点内的用户互通电子邮件, 设定好友名单 1.1.2应用需求 现实生活中的交流存在时间和空间上的局限性,交流人群范围的狭小,以及间断的交 流,不能保证信息的准确性和可取性。因此,用户需要通过网上论坛也就是论坛交流 扩大交流面,同时可以从多方面获得自己的及时需求。同时信息时代迫切要求信息传播 速度加快,局部范围的信息交流只会减缓前进的步伐。论坛系统的开发能为分散于五湖 四海的人提供一个共同交流、学习、倾吐心声的平台,实现来自不同地方用户的极强的 信息互动性,用户在获得自己所需要的信息的同时也可以广交朋友拓展自己的视野和扩 大自己的社交面。 1.3数据字典 BBS论坛系统的数据流程图如下 说明: ——访问信息, ——用户信息, ——发帖子信息, 更新帖子信息, 搜索信息 ——获取帖子信息, 回复信息, 搜索用户, 更新用户信息, 获取用户资料 图2.6 数据流程图 概念结构设计 2.2实体E-R图 2.2.1用户E-R图 2.2.2主贴E-R图 2.2.3版块E-R图 2.2.4回帖E-R图 2.3实体总体E-R图 逻辑设计 数据模式 根据论坛的功能与应用需求的简要介绍,可以得出设计论坛系统所要的基本实体有BBSU ser(用户)、BBSSection(版块)、BBSTopic(主贴)、BBSReply(回复贴)。论坛又称BBS1-3-1  BBSUsers 用户信息 "中列名 "数据类型 "可否为空 "说明 " "UID "Int "not null(主键) "用户编号 " "UName "char "not null "用户姓名 " "UPassword "char "not null "用户密码 " "UEmail "char "not null "用户Email " "UBirthday "datetime "not null "用户生日 " "USex "bit "not null "用户性别 " "UClass "Int "not null "用户等级 " "UStatement "varchar "not null "用户个人说明 " "URegDate "datetime "not null "用户注册时间 " "UState "tinyint "not null "用户状态 " "UPoint "in "not null "用户积分 " 1-3-2  BBSTopic主贴信息格 "中列名 "数据类型 "可否为空 "说明 " "TID "Int "not null(主键) "主帖编号 " "TSID "Int "not null "主帖版块编号 " "Tuid "Int "not null "主帖用户编号 " "TReplyCount "Int "not null "主帖回复次数 " "TEmotion "Char(10) "not null "主帖情 " "TTopic "Varchar "not null "主帖标题 " "TContents "Text "not null "主帖内容 " "TTime "Datetime "not null "发帖时间 " "TClickCount "Int "not null "主帖点击次数 " "TLastClickT "Datetime "not null "主帖最后点击时间" 1-3-3  BBSSection板块信息 "中列名 "数据类型 "可否为空 "说明 " "sid "Int "Not null(主键) "版块编号 " "SName "char "Not null "版块名称 " "SMasterID "Int "Not null "版主编号 " "SStatement "Varchar "Not null "版块说明 " "SClickCo
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(
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值