当前位置: 技术问答>java相关
树型论坛的数据库设计和快速算法(对左轻侯的快速算法的一点小改进)(前20名回复给分)
来源: 互联网 发布时间:2015-10-27
本文导语: 树型论坛的数据库设计和快速算法(对左轻侯的快速算法的一点小改进) 关键字 树型论坛 算法 表结构 杨小志 2002.10.18 树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是...
树型论坛的数据库设计和快速算法(对左轻侯的快速算法的一点小改进)
关键字 树型论坛 算法 表结构
杨小志
2002.10.18
树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种:
第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须执行一条数据库查询,使它在大量并发请求时的负载成为灾难性的。因此这种算法一般不实用。
第二是增加一个排序字段,思路是使用一个特殊设计的字段,例如排序串或者中值排序基数,来实现贴子的插入,在显示的时候,只需要为每一个主贴执行一次查询,将所有得到的记录按序显示即可。这种方式在效率上有了很大提高,但是仍然不很理想,而且使得插入的代码增加了不必要的复杂性,同时还往往导致了支持层次有限制的问题。
有没有一种办法可以简单、高效地实现树型论坛呢?
左轻侯提出一种算法,在显示速度上超过我见的任何类似算法,实现起来也不复杂。
它的思路很简单:就是完全不理会树型结构本身,将整个论坛视为一个简单的顺序表。这样不论任何形式的页面,只需要一条查询即可得到。那么如何实现树型结构呢?方法是添加两个格式化字段,一个记录顺序表的次序,一个记录树的层次,对取得的记录集进行相应格式化,即可得到原汁原味的树型论坛。
我的改进是,
1。取消ordernum,用messageID的顺序来实现,
2。在BBSmessage表里面取消threadID的FK,用算法来映射
3。在BBSthread表里面增设一个endMessageID来为最大MessageID,提高插入数据的速度
具体实现方法如下:
dbschema:
BBSmessage: 贴子表
messageID int : 贴子ID
deep smallint : 树的深度,0为主贴,以此类推
context varchar 4096 : 正文
title varchar 256 : 标题
clickDate timestamp : 阅读时间
createDate timestamp : 创建时间(发布时间)
clickCnt smallint : 人气
rewards smallint : 得分
userID int : 创建用户ID
flag char(1) : 标志 D=删除状态 A =活跃状态
// threadID int : 主题ID = messageID/1000
BBSthread: 话题表
threadID int : 话题ID
forumID int : 所属论坛ID
clickDate timestamp : 阅读时间
createDate timestamp : 创建时间
clickSum smallint : 话题人气
replySum smallint : 回复数量
endMessageID int : 尾部ID
// rootMessageID int : 该话题的根贴子ID,可以用threadID*1000得到rootMessageID
// replyDate timestamp : 最新回复时间,因为可以用lastMessageID得到时间
// title vchar(20) : 标题,可以用threadID*1000得到rootMessageID,再取得title
BBSUserInfo: 用户表
userid int : 用户ID
userNickName vchar 20 : 昵称
sex char (1) : 性别
rewards smallint : 得分
PostCnt smallint : 一共发贴数
icon smallint : 图标ID
列出全部话题列表的SQL:
// 主题 人气 创建人 最后更新时间 回复人 删除属性
select title , clickSum , replyDate , userName , deep , replySum,deep,visual
from
BBSUserInfo,BBSthread,BBSmessage
where
BBSmessage.userid = BBSUserInfo.userid
and
BBSmessage.messageID = BBSthread.rootMessageID
and
BBSthread.messageID
关键字 树型论坛 算法 表结构
杨小志
2002.10.18
树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种:
第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须执行一条数据库查询,使它在大量并发请求时的负载成为灾难性的。因此这种算法一般不实用。
第二是增加一个排序字段,思路是使用一个特殊设计的字段,例如排序串或者中值排序基数,来实现贴子的插入,在显示的时候,只需要为每一个主贴执行一次查询,将所有得到的记录按序显示即可。这种方式在效率上有了很大提高,但是仍然不很理想,而且使得插入的代码增加了不必要的复杂性,同时还往往导致了支持层次有限制的问题。
有没有一种办法可以简单、高效地实现树型论坛呢?
左轻侯提出一种算法,在显示速度上超过我见的任何类似算法,实现起来也不复杂。
它的思路很简单:就是完全不理会树型结构本身,将整个论坛视为一个简单的顺序表。这样不论任何形式的页面,只需要一条查询即可得到。那么如何实现树型结构呢?方法是添加两个格式化字段,一个记录顺序表的次序,一个记录树的层次,对取得的记录集进行相应格式化,即可得到原汁原味的树型论坛。
我的改进是,
1。取消ordernum,用messageID的顺序来实现,
2。在BBSmessage表里面取消threadID的FK,用算法来映射
3。在BBSthread表里面增设一个endMessageID来为最大MessageID,提高插入数据的速度
具体实现方法如下:
dbschema:
BBSmessage: 贴子表
messageID int : 贴子ID
deep smallint : 树的深度,0为主贴,以此类推
context varchar 4096 : 正文
title varchar 256 : 标题
clickDate timestamp : 阅读时间
createDate timestamp : 创建时间(发布时间)
clickCnt smallint : 人气
rewards smallint : 得分
userID int : 创建用户ID
flag char(1) : 标志 D=删除状态 A =活跃状态
// threadID int : 主题ID = messageID/1000
BBSthread: 话题表
threadID int : 话题ID
forumID int : 所属论坛ID
clickDate timestamp : 阅读时间
createDate timestamp : 创建时间
clickSum smallint : 话题人气
replySum smallint : 回复数量
endMessageID int : 尾部ID
// rootMessageID int : 该话题的根贴子ID,可以用threadID*1000得到rootMessageID
// replyDate timestamp : 最新回复时间,因为可以用lastMessageID得到时间
// title vchar(20) : 标题,可以用threadID*1000得到rootMessageID,再取得title
BBSUserInfo: 用户表
userid int : 用户ID
userNickName vchar 20 : 昵称
sex char (1) : 性别
rewards smallint : 得分
PostCnt smallint : 一共发贴数
icon smallint : 图标ID
列出全部话题列表的SQL:
// 主题 人气 创建人 最后更新时间 回复人 删除属性
select title , clickSum , replyDate , userName , deep , replySum,deep,visual
from
BBSUserInfo,BBSthread,BBSmessage
where
BBSmessage.userid = BBSUserInfo.userid
and
BBSmessage.messageID = BBSthread.rootMessageID
and
BBSthread.messageID