
日期: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)就可以輸入所有記錄。