首页 > 开发 > 综合 > 正文

树型结构数据在数据库基本表中的存储及维护

2024-07-21 02:08:55
字体:
来源:转载
供稿:网友

相关讨论连接:
早就想简单说说: 关于树型结构数据的存储及维护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 帖子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
             from tree
            where [email protected]
      --把帖子顶到上面:
      update tree
         set maxid = (select max(id)
                       from tree
                     )
      where rootid = (select rootid
                        from tree
                       where [email protected]
                     )
   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]

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表