相关讨论连接:早就想简单说说: 关于树型结构数据的存储及维护http://expert.csdn.net/Expert/TopicView1.asp?id=1677669
树型结构数据的存储采用:Tree(ID,ParentID,Remark)如果仅对于存储来讲,无疑是最经济!但是利用这样的结构,来提供一些基于稍微复杂点的查询的应用表现形式效率应该说相当低下!如: 查询某节点的路径等!如要高效的查询,我们可以在维护数据时下点功夫!我们以一个树型结构论坛的实现为例:
Tree(ID,ParentID,RootID,OrderID,MaxID,Indent,Title,Content,Remark) ID: Integer 帖子IDParentID: 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)=nullas--declare @id int--set @id=0if @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 endelse 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 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 treeorder 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]
相关讨论连接:早就想简单说说: 关于树型结构数据的存储及维护http://expert.csdn.net/Expert/TopicView1.asp?id=1677669
树型结构数据的存储采用:Tree(ID,ParentID,Remark)如果仅对于存储来讲,无疑是最经济!但是利用这样的结构,来提供一些基于稍微复杂点的查询的应用表现形式效率应该说相当低下!如: 查询某节点的路径等!如要高效的查询,我们可以在维护数据时下点功夫!我们以一个树型结构论坛的实现为例:
Tree(ID,ParentID,RootID,OrderID,MaxID,Indent,Title,Content,Remark) ID: Integer 帖子IDParentID: 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)=nullas--declare @id int--set @id=0if @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 endelse 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 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 treeorder 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]
) ON [PRIMARY] ) ON [PRIMARY]