樹形結構-樹形結構的資料存儲與資料庫表設計

日期:2008-07-17  作者:喜騰小二  來源:PHPChina


樹形結構一般用於無限級分類,無論妳使用Java,.Net,PHP,Python等語言平臺進行開發應用,樹形結構都是很常用的結構設計之一。
本文主要解決樹形結構的資料存儲和資料庫表設計。歡迎妳可以根據妳的應用,提出您的見解!以供討論!

樹形結構的資料存儲
樹形結構的表結構如下:
/********* Object:  Table [dbo].[Tree] ******/
Create TABLE [dbo].[Tree] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[PID] [int] NULL ,
[Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

Create  CLUSTERED  INDEX [IX_Tree] ON [dbo].[Tree]([PID]) ON [PRIMARY]
GO

Alter TABLE [dbo].[Tree] WITH NOCHECK ADD
CONSTRAINT [PK_Tree] PRIMARY KEY  NONCLUSTERED
(
  [ID]
)  ON [PRIMARY] ,
CONSTRAINT [子ID不能等於父ID] CHECK ([ID] <> [PID])
GO

Alter TABLE [dbo].[Tree] ADD
CONSTRAINT [FK_Tree_Tree] FOREIGN KEY
(
  [PID]
) REFERENCES [dbo].[Tree] (
  [ID]
)
GO

樹形結構資料庫表查詢

  不用嵌套調用,直接用一個陳述式就可以生成樹,用暫時表寫了一個存儲過程,改寫為一個表值函式,供大家參考:

 查詢樹表陳述式的表值函式如下:

29  /********* 物件:  使用者定義的函式 dbo.fGetTreeTable ******/
30  Create FUNCTION dbo.fGetTreeTable
31   (
32   @ID int= null
33   )
34  RETURNS @Tab TABLE(ID int, PID int, Name varchar(10), Lev int)
35  AS
36   BEGIN
37    Declare @lev int
38    Set @lev=0
39  
40    While @lev=0 or @@ROWCount>0
41    Begin
42     Set @Lev=@Lev+1
43     Insert @Tab(ID, PID, Name, Lev)
44     Select ID, PID, Name, @Lev From Tree Where (@Lev=1 and ((PID=@ID) or (@ID is null and PID is null))) or (PID in (Select ID From @Tab Where Lev=@Lev-1))
45     order by ID
46    End
47    RETURN
48   END
49
50  GO
51
52  --實際資料
53  Insert Tree(PID, Name) values(null, 公司)
54  Insert Tree(PID, Name) values(3, IT)
55  Insert Tree(PID, Name) values(1, Fin)
56  Insert Tree(PID, Name) values(5, XZ)
57  Insert Tree(PID, Name) values(1, HR)
58  GO

  直接查詢Select * from dbo.fGetTreeTable(null)就可以輸入所有記錄。

<<<返回技術中心

技術文章

站內新聞