文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页网页设计ASP实例 → bbs树形结构的实现方法(一)

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

时间:2004/11/7 2:52:00来源:本站整理作者:蓝点我要评论(0)

【bigeagle】 于 2000-12-6 14:38:50 加贴在 Joy ASP ↑:



    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 = AncestorID

FROM MsgRefTab

WHERE

  MsgID = @ParentID

go



---

是基于这样的想法:

贴子和跟贴都放在message表里,另有MsgRefTab对每一条信息都有描述。

父贴ParentID,0为不是子贴

祖宗贴AncestorID

直接跟贴数ChildNum

联接串LinkStr,学问都在这里,所有的跟贴都用一个数字字符串表示

如是

1011--->            为空

1012--->001         1011的跟贴,父贴LinkStr+父贴的子贴数+1

1013--->001001      1012的跟贴,父贴LinkStr+父贴的子贴数+1

1018--->001001001   1013的跟贴,父贴LinkStr+父贴的子贴数+1

1014--->001002      1012的跟贴,父贴LinkStr+父贴的子贴数+1

1017--->001002001   1014的跟贴,父贴LinkStr+父贴的子贴数+1



部分演示数据:

MsgID ParentID AncestorID ChildNum LinkStr

1010  0        1010       0

1011  0        1011       1

1012  1011     1011       3        001

1013  1012     1011       1        001001

1014  1012     1011       1        001002

1015  0        1015       0

1017  1014     1011       0        001002001

1018  1013     1011       0        001001001



就是算法复杂一点,但只使用select就得到了正确的结构列表。

看了这么多bbs的算法,还是觉得自己的方法好,现实中由存储过程直接生成xml文档,交

给client。








相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 迅雷新手完全入门手册 asp下面javascript上传图片限制格式大小方法告诉大家网页弹出窗口应用总结ASP常见错误类型大全asp常见错误分析和解决办法

人气排行 总是弹出visual studio 实时调试器 三种解决SQLSERVER存储过程及调用详解Asp获取真实IP地址ASP中连接Mssql的几种方法一个简单好用的UBB编辑器(含代码)如何用Split将字符串转换为数组并获取数组下ASP防止表单重复提交的办法告诉你免费的简单聊天室源代码