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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 playyuer 的 blog

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

本文关键:Tree,树,SQL
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top