樹形結構在國人中的需求很多,比如單位和子單位、人員的上下級管理關係等,一般資料庫設計是通過id,pid來確定父子關係,但如果要查詢某個節點下所有的子節點,可以通過with關鍵字查詢效,具體方法可見這篇文章,改進方法主要有兩種:物化路徑和左右節點。對於使用物化路徑,有通過儲存過程實現的,比如 ,最近在網上看了一片文章,主要是對物化路徑的方法進行改進,使用儲存過程自動修改物化路徑,文章可見,具體操作如下:
create主要是新增了兩個輔助列fullpath和hierarchylevel,用於記錄的全路徑和層級。table
[dbo
].[depts](
[id][
int]
identity(1,1) not
null
,
[name][
nvarchar
](50) not
null
,
[fullpath][
nvarchar
](50) null
,
[hierarchylevel][
int]
null
,
[parent_id][
int]
null
,
[sortcode][
int]
null
,)
use[peoplemanage]go
/****** object: trigger [dbo].[trgdeptinsert] script date: 2015/3/27 11:38:28 *****
*/set ansi_nulls on
goset quoted_identifier on
gocreate
trigger
[dbo
].[trgdeptinsert]on
[dbo
].[depts
]for
insert
asbegin
declare
@numrows
intset
@numrows
=@@rowcount
if@numrows
>
1begin
raiserror('
only single row insertion is supported
', 16, 1
)
rollback
tran
endelse
begin
update
e
sethierarchylevel
=case
when e.parent_id is
null
then
0else parent.hierarchylevel +
1end
, fullpath
=case
when e.parent_id is
null
then'.
'else
parent.fullpath
end+
cast(e.id as
varchar(10)) +'.
'from
depts ase
inner
join
inserted
as i on i.id =
e.id
left
outer
join
depts
as parent on parent.id =
e.parent_id
endend
use對於資料的增刪改,不需要理會fullpath和hierarchylevel這兩列,觸發器會自動新增或者修改[peoplemanage]go
/****** object: trigger [dbo].[trgdeptupdate] script date: 2015/3/27 11:39:48 *****
*/set ansi_nulls on
goset quoted_identifier on
gocreate
trigger
[dbo
].[trgdeptupdate]on
[dbo
].[depts
]for
update
asbegin
if@@rowcount=0
return
ifupdate
(parent_id)
begin
update
e
sethierarchylevel
=e.hierarchylevel
- i.hierarchylevel +
case
when i.parent_id is
null
then
0else parent.hierarchylevel +
1end
, fullpath
=isnull(parent.fullpath, '
.') +
cast(i.id as
varchar(10)) +'.
'+right(e.fullpath, len(e.fullpath) -
len(i.fullpath))
from
depts ase
inner
join
inserted
as i on e.fullpath like i.fullpath +'%
'left
outer
join
depts
as parent on i.parent_id =
parent.id
endend
如果要查詢某個節點下的所有節點,只需要使用linke語句即可
資料庫儲存樹形結構的資料
最近接觸樹形結構資料非常的多,幾乎超過了過去8年多,開發所有系統的總和.本來嘛,一般的遞迴就可以解決了,可是這個系統中總是需要頻繁的訪問樹結點,及父結點,子結點,動不動就要遞迴,且樹的使用非常之多,做的多了搞的人都要嘔吐了,下面在網上找到幾篇比較有用的資料,記錄彙總一下.首先,資料庫不一定要用傳統的...
資料結構 樹形結構
樹是一種表達資料之間層次關係的資料結構,樹中的每個節點有0個或者多個子節點,但只有乙個父節點,父節點為空的節點為根節點,一棵樹只有乙個根節點。樹結構的相關概念 數的度 乙個節點含有的子樹的個數成為該節點的度,一顆樹中最大的節點的度成為整顆數的度 葉節點 度為0的節點成為葉節點 根節點 沒有父節點的節...
樹形結構資料的提交
樹形結構資料提交問題 1 標記,關聯工作在jsp中進行 基於樹形結構提交資料的複雜關聯問題乙個控制項的name,value無法包含所有關聯資訊,自身資訊,故用隱藏域,由於隱藏域是統統提交,所以用隱藏域value作為key,能獲取被選中值的就是被選中了,所以組織隱藏域和選擇框資料的時候按照key va...