当前位置:网络资源中心文章中心网络编程ASP教程 → 文章内容

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

减小字体 增大字体 作者:小猪  来源:0423tv.com  发布时间:2008-5-16 9:31:59
于 2000-12-6 14:38:50 加贴在 Joy ASP ↑

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

下面一种方法是李龙的,属于变通的排序串方法
DDL
--------------
CREATE TABLE dbo.Message
(
IDnumeric(18,0) IDENTITY(1000,1),
DateAndTime datetimeDEFAULT getdate() NOT NULL,
AuthorIDnumeric(18,0) NOT NULL,
Subjectnvarchar(250) NOT NULL,
BodyntextNULL,
LinkURLnvarchar(100) NULL,
TextForLink nvarchar(50)NULL,
ImageURLnvarchar(100) NULL,
ClassintDEFAULT 0 NOT NULL,
ClientInfonvarchar(250) NULL,
RemoteAddrnvarchar(50)NULL,
CONSTRAINT PK_BBSMessage
PRIMARY KEY NONCLUSTERED (ID,AuthorID)
)
go
CREATE TABLE dbo.MsgRefTab
(
MsgIDnumeric(18,0) NOT NULL,
ParentIDnumeric(18,0) NOT NULL,
AncestorID numeric(18,0) NOT NULL,
ChildNumnumeric(18,0) DEFAULT 0 NOT NULL,
LinkStrnvarchar(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),
@Bodyntext,
@LinkURL nvarchar(100),
@TextForLink nvarchar(50),
@ImageURL nvarchar(100),
@ParentID numeric,
@IDnumeric 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---%26gt;为空
1012---%26gt;0011011的跟贴,父贴LinkStr+父贴的子贴数+1
1013---%26gt;0010011012的跟贴,父贴LinkStr+父贴的子贴数+1
1018---%26gt;0010010011013的跟贴,父贴LinkStr+父贴的子贴数+1
1014---%26gt;0010021012的跟贴,父贴LinkStr+父贴的子贴数+1
1017---%26gt;0010020011014的跟贴,父贴LinkStr+父贴的子贴数+1

部分演示数据:
MsgID ParentID AncestorID ChildNum LinkStr
1010010100
1011010111
1012101110113001
1013101210111001001
1014101210111001002
1015010150
1017101410110001002001
1018101310110001001001

就是算法复杂一点,但只使用select就得到了正确的结构列表。
看了这么多bbs的算法,还是觉得自己的方法好,现实中由存储过程直接生成xml文档,交
给client。