论坛数据库表设计

时间:2024-03-12 10:47:06

论坛数据库设计是论坛设计的核心,论坛的数据增长是很快的,当数据达到一定量,数据库表结构设计不好则使得系统效率极为低下,

最近在设计项目的论坛上面对数据库优化设计的问题,在网上查看了许多资料结合项目经理的说法,设计自己的想法:

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

存储过程中使用了事务,保证数据在更新后的完整性