论坛数据库设计是论坛设计的核心,论坛的数据增长是很快的,当数据达到一定量,数据库表结构设计不好则使得系统效率极为低下,
最近在设计项目的论坛上面对数据库优化设计的问题,在网上查看了许多资料结合项目经理的说法,设计自己的想法:
1)尽量数据表的级联查询。
在论坛中,数据增长最快的是帖子表与回复表,尤其是回复表,其数量小则一两万,多则上百万,如果使用帖子表去级联回复表来统计帖子的回复数,那么个过程效率是很低的。
那么我们在设计帖子表的时候可以在帖子表上添加统计字段,当添加一条回复时,更新帖子表上的统计字段即可,读取的时候就不必级联回复表这样一个大表来统计。
2)分割大表为若干个小表
在论坛中回复表的数据量比较大,以致查询数据时效率极为低下,那么可以把这个大表分割为若干个小表,
我的设计思想是这样的:根据数据量的大小分割的数量也可以多寡
根据回复记录对应的帖子id对一个数值取模,比如我去的这个数是10,那么一个帖子的id对10取模之后就只有:0,1,2,3,4,5,6,7,8,9这十种情况,于是我们的回复表可以分割为十个
相对较小的数据表。这样一来,我们面对的数据表则小了许多,比如回复表有100万级,那么可以分割为100个小表。这就是很多网友推荐的分割设计方法。在许多富数据的项目中我
们可以看到有些设置则是每日新建一张表,或者月新建一张表,这个其实都是分割设计法
这样设计之后程序的处理就麻烦一点,这是自然的,但是在效率上绝对可以提高,这样添加回复时,除了插入回复信息,还要更新帖子表中的统计信息,可以使用一个存储过程:
create proc [dbo].[addReply]
@topicId int ,
@ReplyContent nvarchar(max),
@createCode nvarchar(max)
as
begin
begin tran declare @TopicIndex int=@topicId%10
update tabTopic set replyRate=replyRate+1 where id=@topicId
declare @sql nvarchar(max)=\'\'
set @sql=\'insert into tabReply\'+CONVERT(nvarchar(1),@TopicIndex)+\' values(\'+Convert(nvarchar(10),@topicId)+\',\'\'\'+@ReplyContent+\'\'\',\'\'\'+CONVERT
(nvarchar(50),GETDATE(),20)+\'\'\',\'\'\'+@createCode+\'\'\',0)\'
select @sql
exec sp_executesql @sql
if @@ERROR<>0
rollback tran
else commit
tran end
GO
存储过程中使用了事务,保证数据在更新后的完整性