樹型結構資料在資料庫基本表中的儲存及維護 (轉)

amyz發表於2007-08-15
樹型結構資料在資料庫基本表中的儲存及維護 (轉)[@more@]

相關討論連線:
/Expert/TopicView1.?id=1677669" target=_blank>早就想簡單說說: 關於樹型結構資料的及維護

樹型結構資料的儲存採用:
Tree(ID,ParentID,Remark)
如果僅對於儲存來講,無疑是最經濟!
但是利用這樣的結構,來提供一些基於稍微複雜點的查詢的應用表現形式
應該說相當低下!
如: 查詢某節點的路徑等!
如要高效的查詢,我們可以在維護資料時下點功夫!
我們以一個樹型結構論壇的實現為例:

Tree(ID,ParentID,ID,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 = ( 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 to:id=@id">id=@id
  --把帖子頂到上面:
  update Tree
  set maxid = (select max(id)
  from Tree
  )
  where rootid = (select rootid
  from tree
  where
  )
  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] NTITY (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]


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958101/,如需轉載,請註明出處,否則將追究法律責任。

相關文章