树型论坛的快速算法

树型论坛的快速算法
左轻侯
2001.10.9

 树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种:第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须执行一条数据库查询,使它在大量并发请求时的负载成为灾难性的。因此这种算法一般不实用。第二是增加一个排序字段,思路是使用一个特殊设计的字段,例如排序串或者中值排序基数,来实现贴子的插入,在显示的时候,只需要为每一个主贴执行一次查询,将所有得到的记录按序显示即可。这种方式在效率上有了很大提高,但是仍然不很理想,而且使得插入的代码增加了不必要的复杂性,同时还往往导致了支持层次有限制的问题。
 有没有一种办法可以简单、高效地实现树型论坛呢?我想到了一种算法,在显示速度上应该超过我见的任何类似算法,实现起来也不复杂。
 思路很简单:就是完全不理会树型结构本身,将整个论坛视为一个简单的顺序表。这样不论任何形式的页面,只需要一条查询即可得到。那么如何实现树型结构呢?方法是添加两个格式化字段,一个记录顺序表的次序,一个记录树的层次,对取得的记录集进行相应格式化,即可得到原汁原味的树型论坛。
 具体实现方法如下:
1、数据库结构。只列出必需的字段,全部为int型:
id:贴子序号
ordernum:排序字段,按照显示顺序从大到小,最早的一条贴子为1
levelnum:树的层次,0为主贴,以此类推 
2、显示。使用一条语句:“select * from article order by ordernum DESC”,得到需要的记录集。遍历记录集,检查它的levelnum字段,设置相应的缩进。为0则是主贴,不缩进,为1则缩进一层,以此类推,然后显示之。
3、插入。关键是如何设置ordernum字段。分为两种情况:
一是发新的主贴,相当于在顺序表的最后添加一条记录。这样最简单,只需要通过查询,得到max(ordernum),然后将ordernum字段设置为该值加1即可。
二是跟贴,相当于在顺序表的中间插入一条记录。方法是,先得到插入点的ID(即跟贴的父贴ID),将该贴的ordernum值赋予新贴,然后将所有插入点之前(包括插入点本身)的记录的ordernum全部加1,等于让它们在顺序表中往后移一位,腾出位置。举例来说:要在一个ID为23的贴子之后跟贴,首先select得到ID23的ordernum,假设为18,将其赋予新贴的ordernum;然后执行“update article set ordernum = ordernum + 1 where ordernum >= 18”,将新贴之后的贴子全部后移。
 效率分析:
 显示速度应该不会更快了,仅仅是一条简单的select,对一个int字段进行排序,而且支持无限的回复层次。相比之下,递归需要为一个页面中的每一条贴子进行一次select,对datetime字段进行排序,而“主贴排序字段法”需要为每一个主贴进行一次select,对char字段进行排序。
 最大的问题在于插入时,如果插入的位置很靠前,可能要更新大量记录的ordernum字段。但是经验告诉我们,这种树型论坛,回复一般都集中在第一二页,极少有人回复很久以前的贴子,所以偶尔为之,也不会增加太大的负担。如果你实在不放心,也可以用技术手段强制禁止回复一段时间之前的贴子。
 本论坛的实现见“Delphi开发者资源社区”(http://delphi.mychangshu.com)的附属论坛,全部源代码提供下载,基于ASP+ACCESS。

  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
阿赛树形论坛系统(AsaiSXBBS)是一套新颖、高速、安全、实用论坛系统,拥有普通论坛所有功能,基于ASP ACCESS全伪静态(后缀为.html)访问模式。管理员(帐户:77ya.com,密码:77ya.com,从会员登录入口直接登录即可!);普通会员(郭言赛,77ya.com 阿赛树形论坛系统(AsaiSXBBS) V5 新增功能: 0、更新编辑器为阿赛经典HTML编辑器,功能强大、使用方便 快捷; 1、增加短消息功能; 2、增加金币交易管理,支持购买记录查看、出售记录查看; 3、管理员可以对交易订单直接取消、退款功能; 4、重新优化会员和管理功能,使用同一个入口,指定某一会员为管理员功能,获取登录后管理权利; 5、支持热门关键词功能,自动记录搜索字词,后台可设置热门关键; 6、支持网站在线设置; 7、提供帖子自动锁定和手工锁定功能; 8、增加帖子批量删除、会员批量删除、短信批量删除、交易记录批量删除等各式批量操作功能; 9、支持过滤敏感词汇功能,提供过滤词汇替换功能; 10、提供发帖间隔控制功能,分时段发帖功能,更多功能请使用体验; 12、可设置仅会员可以访问论坛; 13、可以锁定帖子,禁止修改、回复该帖功能; 14、可严格控制各个等级会员发帖权限,普通会员可以发布普通贴、会员帖、回复贴,认证会员可以发布金币贴,高级会员可以发布金币贴、可以回复锁定帖子,超级会员和管理员可以发布入库贴。 系统功能介绍: 01、独立完整论坛体系,具备发帖、回帖、置顶、精华、经验帖、会员帖等常用论坛所有功能; 02、独立完整会员体系,与论坛体系分离,可删除、替换其他会员系统,并能无缝对接各种大中型网站会员系统; 03、优化各大搜索引擎收录,全站默认全伪静态(后缀名.html)访问; 04、全新原创树形论坛架构理念,速度更快、外形更加美观,帖子之间关系一目了然; 05、集成管理员功能,提供编辑、删除、一键清理过期帖子,删除帖子树等多种高级功能; 06、提供热门点击、热门回帖、最新发帖等帖子标记方便检索浏览,同时提供热门关键词、热门标签等栏目类功能; 07、支持帖子搜索、标签分类等、帖子主题、发帖心情等论坛高级功能; 08、提供单帖浏览、单帖回复,支持回复贴置顶、标记精华等操作; 09、会员登录后可修改、删除自己发帖,管理员可批量对帖子进行操作; 10、支持我帖子列表、热门帖子列表、火热帖子排行、精华帖子列表、帖子排序列表等各种列表方式; 11、会员系统支持E-Mail在线认证,认证后可获得一定经验和金币奖励; 12、管理员可对会员进行查找、筛选、修改、删除等基本操作; 13、会员登录后可修改自己资料,也可自行通过对邮箱进行认证; 14、全伪静态(后缀名.html)模式会员系统,更安全、更快捷; 15、精简程序为4个文件,解压后空系统大小约200KB,所有调用修改及网站标题等修改均在AsaiFun.asp文件中,方便大家设置; 16、设置入库贴,放置会员或管理员不当操作删除掉,有效保护好帖、精华帖,提供类似信息系统一般过期废帖删除功能; 17、金币贴,可以任意设置查看需要收取金币个数,所有收取金币回归系统; 18、金币内容,可设置固定金币内容查看需要收取金币个数,设置金币内容可以从购买者处获得50%收益,其他被系统回收; 19、回复贴与回复内容功能,只有参与回复会员才能浏览帖子内容或被设为仅回复可看内容; 20、可以设置是否关闭论坛、关闭论坛时间; 21、可以限制发布特殊贴(回复贴、金币贴等)会员等级,默认仅VIP会员和管理员可发布; 22、可以设置发帖、回帖间隔时间; 23、支持UBB所见即所得编辑器,可以编辑视频、音频、动画SWF、图片等媒体文件,同时可以插入QQ在线状态,添加免费信息、回复信息、金币信息、引用信息等等,超强可视化帖子编辑器; 常见问题: 1、怎么修改数据库以及数据库链接? 答:AsaiBBSInc文件夹中bbsconfig.asp可以直接修改数据库具体位置与名称,修改后同时需要修改AsaiBBSData文件夹下数据库名称[为防止恶意下载,请上传使用前务必修改一下]。 2、论坛名称以及相关信息怎么修改为自己需要信息? 答:所有需要修改地方都在AsaiBBSInc文件夹中bbsconfig.asp里面,高级修改设置请打开AsaiBBSInc和AsaiBBSUser文件夹下AsaiBBSFun.asp、AsaiFun.asp,所有系统过程与设置均在里面。 3、如何修改论坛界面? 答:我们做了一些论坛风格和用户界面,大家可以打开AsaiBBSUser文件夹下Default.asp中修改论坛会员界面,打开AsaiBBSInc文件夹AsaiBBSFun.asp修改首页风格,所有程序部分内容均封装在**Fun.asp中,全开源大家可以自行改动。 4、如何登录后台? 答:首先注册一个会员帐户,在AsaiBBSInc文件夹中bbsconfig.asp中可指定某一个论坛会员为管理员,从会员登录口登录该会员以后,可以获得管理员功能,管理所有会员信息,管理所有帖子信息等。 5、从网上下载和官方演示相同吗? 答:是不同,网上共享是MF(免费版),仅供学习使用,不可商用,如觉得系统不错可以至官网http://77ya.com购买商业版使用,谢谢您支持。 6、用IIS调试时候无法打开首页? 答:如果您IIS文档中没有设置Default.asp为默认首页,请添加,否则无法正常运行,建议初学者关闭IIS,复制地址http://77ya.com/rar/iis.rar,下载阿赛网站系统专用IIS调试工具,进行调试。 版权声明及购买者义务: 1、本程序由阿赛工作室促权,阿赛独立开发完成,与其他网站和个人无关,所有版权均由阿赛工作室所有; 2、购买者不得公开、传播本程序,如发现,将予以民事诉讼,请务必遵守; 3、支持购买者对程序进行再开发使用,但禁止将非共享版内任何源程序暴露; 4、《阿赛树形论坛系统》最终解释权归阿赛工作室,藉由江苏律师事务所提供全程法律支持。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值