bbs树形结构的实现方法(一)

    bbs的树形结构显示可以有很多种方法,其中比较容易想到的是递归和排序串方法,但这两种方法并不是很好,那么怎样才算是比较合理的算法呢?
    递归方法不用讲,大家都知道怎么用,先讲讲排序串方法,最简单的排序串方法可以这样用,只用一个id就可以完成树型,向这样
1  001
2  002
3  001001
4  001001001
5  001002001
用这个字符串排序后就变成这样:
001
   001001
         001001001
   001002001
002
这种方法容易实现,但缺点也是很明显,一个是回帖数受限制,另一个随着回帖增加会越来越长,影响数据库效率。  

下面一种方法是李龙的,属于变通的排序串方法
DDL
--------------
CREATE TABLE dbo.Message
(
    ID          numeric(18,0) IDENTITY(1000,1),
    DateAndTime datetime      DEFAULT getdate() NOT NULL,
    AuthorID    numeric(18,0) NOT NULL,
    Subject     nvarchar(250) NOT NULL,
    Body        ntext         NULL,
    LinkURL     nvarchar(100) NULL,
    TextForLink nvarchar(50)  NULL,
    ImageURL    nvarchar(100) NULL,
    Class       int           DEFAULT 0 NOT NULL,
    ClientInfo  nvarchar(250) NULL,
    RemoteAddr  nvarchar(50)  NULL,
    CONSTRAINT PK_BBSMessage
    PRIMARY KEY NONCLUSTERED (ID,AuthorID)
)
go
CREATE TABLE dbo.MsgRefTab
(
    MsgID      numeric(18,0) NOT NULL,
    ParentID   numeric(18,0) NOT NULL,
    AncestorID numeric(18,0) NOT NULL,
    ChildNum   numeric(18,0) DEFAULT 0 NOT NULL,
    LinkStr    nvarchar(250) NOT NULL,
    CONSTRAINT PK_BBSRefTab
    PRIMARY KEY NONCLUSTERED (MsgID)
)
go
-----------------
存储过程:
-----------------
-- 抽出
CREATE PROCEDURE sp_Summary
@HaveBody bit,
@from numeric,
@to numeric
AS
IF (@HaveBody = 1)
select t.ID,t.DateAndTime,m.Nickname as
Author,m.Email,t.Subject,t.Body,t.LinkURL,t.TextForLink,t.ImageURL,s.ChildNu
m,s.ParentID
from Message t
  ,MsgRefTab AS s
  ,(SELECT MsgID FROM MsgRefTab WHERE ParentID = 0) AS f
  ,Members AS m
where t.ID=s.MsgID
  and f.MsgID = s.AncestorID
  and f.MsgID between @from and @to
  and m.MemberID = t.AuthorID
order by s.AncestorID,s.LinkStr
ELSE
select t.ID,t.DateAndTime,m.Nickname as
Author,m.Email,t.Subject,t.LinkURL,t.TextForLink,t.ImageURL,s.ChildNum,s.Par
entID
from Message t
  ,MsgRefTab AS s
  ,(SELECT MsgID FROM MsgRefTab WHERE ParentID = 0) AS f
  ,Members AS m
where t.ID=s.MsgID
  and f.MsgID = s.AncestorID
  and f.MsgID between @from and @to
  and m.MemberID = t.AuthorID
order by s.AncestorID,s.LinkStr
go

-- 加贴

CREATE PROCEDURE sp_Add_Message
@AuthorID numeric,
@Subject nvarchar(250),
@Body  ntext,
@LinkURL nvarchar(100),
@TextForLink nvarchar(50),
@ImageURL nvarchar(100),
@ParentID numeric,
@ID  numeric OUTPUT,
@ChildNum numeric OUTPUT,
@LinkStr nvarchar(250) OUTPUT,
@AncestorID numeric OUTPUT
AS
INSERT INTO Message(
  AuthorID,
  Subject,
  Body,
  LinkURL,
  TextForLink,
  ImageURL)
VALUES(
  @AuthorID,
  @Subject,
  @Body,
  @LinkURL,
  @TextForLink,
  @ImageURL)

SELECT @ID = @@IDENTITY

UPDATE MsgRefTab
SET
  ChildNum = ChildNum+1
WHERE
  MsgID = @ParentID

SELECT @ChildNum = ChildNum,
  @LinkStr = LinkStr,
  @AncestorID =

时间: 2024-11-02 19:07:48

bbs树形结构的实现方法(一)的相关文章

bbs树形结构的实现方法(三)

下面这种方法是white提出来的. BBS数据库结构的浮点数表示法 BBS由一系列的文章组成,每篇文章有一些基本属性,比如作者,创建时间,文章编号等.其中最为重要的,用以表示树形结构的是层和序数.层表示位于文章树的第几层,最高层的帖子层等于0,其回复的层为1,回复的回复层为2,以此类推.所有层等于0的帖子依时间顺序其序数分别为1,2,3.....剩下的帖子的序数满足以下条件:当所有帖子按照树形显示的时候,其序数从大到小排列,没有例外. 上述方法具体到BBS的实现时,各种操作如下进行:0.系统维护

树形结构 解析-json树形结构解析的方法

问题描述 json树形结构解析的方法 [ { "id": "1", "pid": "0", "name": "1989-01-12", "children": [ { "id": "2", "pid": "1", "name": "企划分部二", &

ALL IN ONE : 利用存储过程实现BBS树形结构的存储及有回复email通知(不必借助任何组件发Email)功能的实...

存储过程     BBS的树形结构一直是大家讨论的话题,以前我做都是利用命名规则来实现,这样的好处是表的冗余字段少,结构清楚,容易理解,但其局限性也很明显.感谢廖家远提供算法(实话说,当年算法就没有学好),我决定采用一下这种算法来实现bbs的树形结构.基本思路如下:    bbs文章表中有这样几个字段:    RootID :   根ID , 新发贴子及其所有子贴都相同.    FatherID:  父ID , 父贴子ID    Layer:     层数 , 贴子在树中的深度.    Orde

ALL IN ONE:利用存储过程实现BBS树形结构的存储及有回复email通知功能的实现(三,完)

存储过程 下面读取纪录的存储过程:<br><br>if exists(select * from sysobjects where ID = object_id("up_GetTopic"))<br>   drop proc up_GetTopic<br>go<br><br>create proc up_GetTopic @a_intID int<br>   as<br>      decl

不用递归实现树形结构的一种方法

递归 不用递归实现树形结构的一种方法 主要的技巧在Level(帖子回复深度)的操作上 SunADM 于 2000.07.26____________________________________________演示表的结构____________________________________________ 表名:BBS 字段数据类型说明ID自动编号 RootIDInt根帖ID,本身为根帖则RootID = IDFIDInt父帖ID,上一层帖子的ID,如是根帖则FID = NULLLevel

用递归的方法将树形结构生成文本并输出

今天下午,吃饱了没事干,突然想写点什么,于是不由自主地想起了某件往事,当年在做XXX的时候好像有一个功能没有做出来.据说算法很复杂,当时就没有研究. 不过,今天想到用递归的方法,把这个功能大致做出来了,虽然称不上完美,至少还是比较简单的,而且代码也不多,才几行. 先给大家看看运行结果,如下图: 其实我说的这么神秘,也没什么,就是这个,把树形的目录结构输出到一个TXT文件中. 其实当初的项目要求比这个更复杂,所以我当时没想到解决方法,不过,像上图这样,虽说远没有达标,不过,至少也不算很难看. 原理

Delphi中根据分类数据生成树形结构的最优方法

一. 引言: TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能,因而受到广大程序员的青睐. 树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多.结构复杂的数据,如何快速构造树形目录并实现导航呢? 二. 实现关键技术: 在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码.即它的列表项要在程序中动态添加,而这些列表数

下拉框 树形结构选择-EXT 2.0版本实现下拉框树形结构选择实现过程和方法

问题描述 EXT 2.0版本实现下拉框树形结构选择实现过程和方法 最近在用EXT 2.0开发一个项目,涉及到一下下拉框选择管理机构的问题,点击下拉框要求是树形选择机构,单选.多选都行.烦请各位大侠指点迷津,一定要详细点啊,我在网上看了挺多, 但也不是很好用. 我只需要从我的框架结果采用Struts2.0+Spring+Ibatis,我只需要从action中返回数据到 页面js这两个地方的解决办法.谢谢 解决方案 //下拉框 var permissCombox=Ext.create('Ext.fo

e1-帮忙解析这个树形结构的JSON。求方法

问题描述 帮忙解析这个树形结构的JSON.求方法 [{"id":"297e1e2e44770cfc01449f43aad100bc","pid":null,"text":"华南区","isexpand":null,"classes":"folder","hasChildren":null,"expanded"