网络编程
位置:首页>> 网络编程>> Asp编程>> 整理一个asp多级树型分类问题的解决方法(9)

整理一个asp多级树型分类问题的解决方法(9)

 来源:csdn 发布时间:2007-10-17 18:38:00 

标签:树,分类,asp

这是CSDN的双规干部写的关于树型的存储和维护

树型结构数据的存储采用:

Tree(ID,ParentID,Remark)

如果仅对于存储来讲,无疑是最经济!

但是利用这样的结构,来提供一些基于稍微复杂点的查询的应用表现形式

效率应该说相当低下!

如:  查询某节点的路径等!

如要高效的查询,我们可以在维护数据时下点功夫!

我们以一个树型结构论坛的实现为例:

Tree(ID,ParentID,RootID,OrderID,MaxID,Indent,Title,Content,Remark)

           ID:  Integer  帖子ID

ParentID:  Integer  父贴ID

   RootID:  Integer  根帖ID

 OrderID:  Integer  同一个根帖中,帖子顺序ID

     MaxID:  Integer  用于使新贴在顶部

   Indent:  Integer  缩进量

     Title:  Varchar  帖子标题

 Content:  Varchar  帖子内容

   Remark:  Varchar  除  ID,ParentID  外的贴子线索

这样的设计只要维护好每一个字段都为查询显示提高了效率!

请看下面的维护程序:

 


alter  procedure  AppSP_AddNew 
@ID  integer 
,@Title  varchar(8000)  =null 
,@Content  varchar(8000)=null 
as 
--declare  @id  int 
--set  @id=0 
if  @ID=0 
     begin 
           insert  into  Tree  (ParentID,OrderID,Indent,Title,Content) 
                               values  (0,0,0,@Title,@Content) 
           --把帖子顶到上面: 
           update  Tree 
                 set  RootID  =  ID 
                         ,MaxId  =  (select  max(id)  from  Tree) 
             where  RootID  is  null 
     end 
else 
     begin 
           --调整同一个"根帖"中,帖子的内部顺序: 
           update  Tree 
                 set  OrderID  =  OrderID  +  1 
             where  RootID  =  (select  rootid   
                                                 from  tree   
                                               where  ID  =  @id) 
                         and  OrderID  >  (select  OrderID 
                                                           from  Tree 
                                                         where  ID  =  @id 
                                                     )   
           --插入回复的帖子,同时维护  RootID,ParentID,OrderID,Indent,remark,Title,Content 
           insert  into  Tree  (RootID,ParentID,OrderID,Indent,remark,Title,Content) 
                     select  RootID,@ID,OrderID+1,Indent  +  1 
                                   ,case  when  remark  is  null  then  cast(parentid  as  varchar) 
                                               else  remark  +  -  +  cast(parentid  as  varchar)   
                                     end   
                                   ,isnull(@Title,Re:    +  Title),@Content 
&nbsp, ;               &nb, sp;        from  Tree 
                       where  id=@id 
           --把帖子顶到上面: 
           update  Tree 
                 set  maxid  =  (select  max(id)   
                                             from  Tree 
                                         ) 
           where  rootid  =  (select  rootid   
                                               from  tree   
                                             where  id=@id 
                                         )   
     end



该程序用于

1.增加新贴: 

 AppSP_AddNew  0,第一个问题,地球是圆的吗?

2.回复帖子:

 AppSP_AddNew  1,Re:  第一个问题,地球是圆的!

这样,只需简单查询:

select  *,    remark    +  -  +  cast(parentid  as  varchar)  +  -  +  cast(id  as  varchar)  ,  space(indent)  +  [  
from  tree order  by  MaxID  desc,orderid
就可高效的实现帖子列表及其线索,级别等!

虽然维护时增加了一些工作量!

--相关DDL脚本:


CREATE  TABLE  [Tree]  (
 [ID]  [int]  IDENTITY  (1,  1)  NOT  NULL  ,
 [ParentID]  [int]  NULL  ,
 [RootID]  [int]  NULL  ,
 [OrderID]  [int]  NULL  ,
 [MaxID]  [int]  NULL  ,
 [Indent]  [int]  NULL  ,
 [Title]  [varchar]  (50),
 [Content]  [varchar]  (200)  ,
 [Remark]  [varchar]  (250)  ,
 CONSTRAINT  [PK_Tree]  PRIMARY  KEY    CLUSTERED  
 (
   [ID]
 )    ON  [PRIMARY]  
)  ON  [PRIMARY]


 


0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com