• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        bbs樹形結構的完成辦法(一)

        bbs樹形結構的完成辦法(一)

        更新時間:2019-09-02 文章作者:未知 信息來源:網絡 閱讀次數:

        【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。



        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 国产精品永久免费视频| 美女视频黄.免费网址 | 久久99亚洲网美利坚合众国| 特黄aa级毛片免费视频播放| 国产极品美女高潮抽搐免费网站| 亚洲色少妇熟女11p| 日韩免费无码一区二区视频| 亚洲精品久久无码| 国产精品免费一级在线观看| 国产精品亚洲综合一区在线观看| 免费看国产一级片| 老司机福利在线免费观看| 亚洲国产高清在线一区二区三区| 日韩免费高清一级毛片| 久久精品亚洲福利| 中文字幕日本人妻久久久免费| 亚洲av无码一区二区三区乱子伦 | 亚洲国产精品一区| 亚洲一区免费观看| 亚洲国产精品乱码在线观看97| 久久精品网站免费观看| 亚洲av成人一区二区三区观看在线 | 亚洲乱码中文字幕久久孕妇黑人 | 伊人免费在线观看| 亚洲综合自拍成人| 在线免费观看一区二区三区| 污污视频免费观看网站| 亚洲成a人片在线观看日本| 久久久久久精品免费免费自慰| 亚洲日本va一区二区三区| 四虎影视在线永久免费观看| 在线免费视频你懂的| 亚洲激情电影在线| 国产午夜无码视频免费网站| baoyu122.永久免费视频| 亚洲偷自精品三十六区| 免费一级大黄特色大片| 91福利免费视频| 国产午夜亚洲精品不卡免下载| 日本亚洲视频在线| 免费观看大片毛片|