博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

树型结构数据在Sql的存储管理

Posted on 2005-07-08 20:24  AOL  阅读(779)  评论(0)    收藏  举报

刚接触数据库编程,对SQL不熟。最近做了一个树型结构数据的东西。
表的结构设计为:

ClassId int 类结点ID
ClassName varchar(100) 类结点名
ParentId        int  父结点ID
ParentPath varchar(255) 父结点到此类结点的路径
RootId int 根结点ID
OrderId int 此结点在同一级结点中的序数
ChildNumber int 子结点数
PrevNodeId int 同级上一结点ID
NextNodeId int 同级下一结点ID

插入一个类结点 AddNewSiteClass(@ParentClassId, @ClassName)的存储过程为:
alter procedure AddNewSiteClass
    
    
@ParentId int,
    
@ClassName varchar(100= null

as


declare @parentDepth int@parentPath varchar(255), @parentName varchar(100)
declare @depth int
declare @maxRootId int@rootId int
declare @orderId int,@prevOrderId int
declare @prevId int

select @maxRootId = max(RootId) From TSiteClass

-- 如果是加在根结点上
if @ParentId = 0
    
begin
        
select @prevId = ClassId from TSiteClass where RootId = @maxRootId and Depth = 0 
        
set @ParentId     = 0
        
set @parentPath = '0'
        
set @orderId     = 0
        
set @rootId    = @maxRootId + 1
        
set @prevId     = 0
         
set @depth    = 0
    
end
    
-- 如果不是加在根结点上    
else if @ParentId > 0
    
begin
        
declare @childNumber int
        
select
            
@rootId            = RootId, 
            
@parentName        = ClassName, 
            
@depth            = Depth + 1
            
@parentPath        = ParentPath,
            
@childNumber        = ChildNumber, 
            
@prevOrderId        = OrderId
        
from TSiteClass
        
where @ParentId = ClassId
        
        
set @orderId = @prevOrderId + 1

        
if @parentPath = '0'
            
begin set @parentPath = cast(@ParentId as varcharend
        
else 
            
begin set @parentPath = @parentPath + ',' + cast(@ParentId as varcharend        
    
        
if @childNumber > 0
            
begin
                
select @prevOrderId = max(OrderId) from TSiteClass where  @ParentId = ParentId
                
select @prevId = ClassId from TSiteClass where @ParentId = ParentId and @prevOrderId = OrderId
                
set @orderId = @prevOrderId + 1             
            
end
        
else
            
begin
                
set @prevId = 0
                
--set @orderId = 1
            end
        
    
end

-- 插入一个新的类别
insert into TSiteClass 
    (ClassName,
     ParentId,
     ParentPath,
     RootId,
     OrderId,
     Depth,
     ChildNumber,
     PrevNodeId,
     NextNodeId)
values 
    (
@ClassName,
     
@ParentId,
     
@parentPath,
     
@rootId
     
@orderId,
     
@depth,
     
0,
     
@prevId,
     
0)

-- 更新受影响的行
declare @newClassId int
select @newClassId = max(ClassId) from TSiteClass
if @prevId > 0
    
update TSiteClass set NextNodeId = @newClassId where ClassId = @prevId    

if @ParentId > 0
    
begin
        
--父结点所拥有的子孙结点数加一
        update TSiteClass set ChildNumber = ChildNumber + 1 where ClassId = @ParentId
        
--比被插入的OrderId大的通通加一
        update TSiteClass 
        
set OrderId = OrderId + 1 
        
where @rootId = RootId and OrderId >= @orderId and ClassId != @newClassId
    
end