zoukankan      html  css  js  c++  java
  • 树型结构数据在数据库基本表中的存储及维护

     

    相关讨论连接:
    早就想简单说说: 关于树型结构数据的存储及维护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
                           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]

    相关讨论连接:
    早就想简单说说: 关于树型结构数据的存储及维护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
                           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]


     )  ON [PRIMARY]
    ) ON [PRIMARY]

  • 相关阅读:
    分布式 基本理论 CAP
    iptables四表五链
    iptables四个表与五个链
    内存布局:栈,堆,BSS段(静态区),代码段,数据段
    linux系统pam配置
    Visio绘制时序图
    PHP中require和include路径问题总结
    ECSHOP购物流程收货人信息详细地址显示省市区
    我用的一些Node.js开发工具、开发包、框架等总结
    ECSHOP如何解决购物车中商品自动消失问题
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485786.html
Copyright © 2011-2022 走看看