论坛数据库设计与性能优化

题目:

一个简单的论坛系统 

1:包含下列信息: 

2:每天论坛访问量300万左右,更新帖子10万左右。 

请给出数据库表结构设计,并结合范式简要说明设计思路。 
结合这个题目把论坛系统设计相关知识点进行一下总结。

1 对于发帖主题和回复信息是否放在一张表中的讨论:

支持放在一起的实现和理由:

支持理由:在巨量数据表之间,数据库的连接和表与表之间的连接是相当耗性能的操作,在显示和检索数据时,尽量减少数据库的连接

以及表与表之间的连接。

实现方式:

为了避免T_Topics和T_Reverts两表之间的连接,考虑把发帖主题和回复信息存放在一张表(T_Infos)里面,
1: user:用户基本信息表 
字段有:user_id,user_name,email,homepage,tel,add... 

2: forum_item:主题和回复混合表 
字段有:id,parent_id,user_id,user_name,title,content,.... 

parent_id=0或者null表示是主题,否则=n表示是id=n那条帖子的回复 。

T_Users和T_Infos连接,可以通过在T_Infos表内增加UserName字段来解决和它的连接,显示时,性能能够得到保证,UserName字段是冗余的,因此在用户修改UserName的时候就会产生同步数据的问题,这个需要程序来进行弥补,并是我们认为用户不会经常性的修改他的用户名这样的前提下。

反对理由:

1不同意冗余的存在的。表面上看起来好像少查了一张表,但是因为帖子数量极大,会因为冗余(有些T_Topics需要的属性T_Reverts不需要,这样会导致冗余)

占用、浪费大量的空间。

2虽然题目中没有说明,但实际应用中,查阅帖子通常只会分页显示,而一页最多也就显示几十个帖子,那么实际上只要SQL语句构造得好,T_USER表其实只是跟一个只有几十行结果集的的子查询进行连接,应该基本不用担心出现性能问题。 而且实际上,一个万行级的表简单关联百万行级的表(其实镇魂歌数量级在我看来其实也算不上很大的表),在数据库方面完全有很多优化方式,甚至可以通过提高硬件配置来改善性能,实在没有很大必要进行结构上的冗余。一旦结构有冗余,为了保证数据一致性,往往你还要消耗更多的资源,反而得不偿失。

纵观网友的意见,几种常用的论坛设计方法,总结如下:

一 分割思想:

1   数据库切分:用户库、主题库、回复库

2   数据表水平切分:用户库1-n、主题库1-n、回复库1-n (比如按时间分)
3   分布式数据库:每台计算机中都有DBMS的一份完整拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的大型数据库。

4   论坛功能可以进行分隔,不同的服务器负责不同的功能

5  用主从数据库,master是写, slave是读
6  把内容与其它信息分开,好处就是可以让每个表的文件最小化,对数据库操作压力会减小,这样保证每张表数据量很小,操作速度会快,也可以在这里使用缓存

二 索引:

针对是否建立索引有着一定的分歧:

我觉得建立索引还是很有必要的。理由如下:

1)建立索引可以加快检索速度,对于论坛读和写的比例相差很大,用户体验当然是读多写少,所以综合考虑还是要用索引,而且是加在常用的读关键字上。

2)索引之所以会降低更新的速度,是因为更新还包括对索引的更新,从更新帖子10万左右,这句话是说,我们可能对发帖标题,发帖内容,回复标题,回复内容这4个字段做更新。需要注意的是,这四个字段并不是用来建立表连接的字段,为了优化查询速度我们不会在这四个字段上建立索引,所以从这道题目出发,我们建立的索引不会影响更新帖子的性能。只要被索引的列(例如回复表的标题ID)不被频繁更新,即使索引所在地行的其它列被频繁update,索引也不会被更新从而产生性能消耗,一张表一天30万次的索引更新,因它引起的性能消耗小到即使数据库安装在奔腾3单核CPU下都能轻松承担下来。

3)对于更新的速度慢的问题,我们有解决的方法,你提交更新了后,前台可以让程序返回一个正确结果,后台开个线程异步慢慢跟新数据库就是了,反正更新成功的前提就是假设数据库连接永远正确并处于可靠状态。在数据库和用户之间建立一个缓冲区。(如,将更新的数据放到内存中,达到一定数量的时候再统一更新数据库。假如以100条为例,一旦内存中达到100条数据量将这100条数据统一入库。减少insert操作)

三 缓冲: 

读的时候的缓冲:缓存路由表

主题缓存表(这个取每个区的前面100条记录),一般来说负载最大的就是主题的第一页,所以缓存表是个小表。 
另外使用hibernate,在数据库上面加了一层缓存。

生成静态页,缓存最热,最新的帖子。

 对于经常更新的数据都设计成单独表 ,这样可以最大程度的利用hibernate缓存

 缓存常用的数据和表,利用缓存来将经常被访问的帖子留在内存中,为每条缓存的记录添加一个访问时间,如果长时间没被访问就从缓存中删除掉,

 避免内存过大,每次用户看帖的时候,首先检索缓存中时候有需要的帖子,没有的话再访问数据库,然后将数据库返回的帖子信息存储到缓存中。

写的时候的缓冲:数据库和用户之间建立缓存,将更新的数据放在内存中,异步操作的。所有的写贴操作 放到一个队列然后批量执行插入数据库操作。 

预估计的缓冲:假如用户第一次打开某标题,那将此标题的相关的前100条数据缓存到客户断。这样避开对数据库的直接查询,减少数据库压力。

四 代码优化 

1尽量避免表的连接约束通过代码来实现约束 例如用户id的验证在用户登录时验证这样就可以把帖子表的用户id外键去掉这样就成了单表操作、查询 而连接可以通过触发来实现这样最多是查询了3个表而不是连接中的笛卡尔笛卡尔积  回复表的查询限定每次查询的记录数例如限定10条其它的通过点击触发来操作"注代码优化容易出现bug 原因有些开发工具本身有优化" 

五 数据库性能调优 

尽量用硬件来代替软件优化 原则就是能用硬件的尽量用硬件 比如磁盘阵列 RAID0 有条件用RAID10 加大内存 .避免小表上建索引 对论坛来说数据帖子和回复不是很重要 可以定期删除一些垃圾帖子 楼主说的几百万条记录的论坛对现在的数据库管理系统和计算机来说永不着刻意的优化,定期维护打包备份数据库就可以了

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

5 定期对表进行转储



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 需求分析 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(回复贴)。论坛又称BBS。 表1-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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值