数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
树型结构数据在数据库基本表中的存储及维护

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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




相关文章

相关软件