樹形結構資料的儲存

2022-03-09 18:14:42 字數 3237 閱讀 6586

樹形結構在國人中的需求很多,比如單位和子單位、人員的上下級管理關係等,一般資料庫設計是通過id,pid來確定父子關係,但如果要查詢某個節點下所有的子節點,可以通過with關鍵字查詢效,具體方法可見這篇文章,改進方法主要有兩種:物化路徑和左右節點。對於使用物化路徑,有通過儲存過程實現的,比如 ,最近在網上看了一片文章,主要是對物化路徑的方法進行改進,使用儲存過程自動修改物化路徑,文章可見,具體操作如下:

create

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

,)

主要是新增了兩個輔助列fullpath和hierarchylevel,用於記錄的全路徑和層級。

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

[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

對於資料的增刪改,不需要理會fullpath和hierarchylevel這兩列,觸發器會自動新增或者修改

如果要查詢某個節點下的所有節點,只需要使用linke語句即可

資料庫儲存樹形結構的資料

最近接觸樹形結構資料非常的多,幾乎超過了過去8年多,開發所有系統的總和.本來嘛,一般的遞迴就可以解決了,可是這個系統中總是需要頻繁的訪問樹結點,及父結點,子結點,動不動就要遞迴,且樹的使用非常之多,做的多了搞的人都要嘔吐了,下面在網上找到幾篇比較有用的資料,記錄彙總一下.首先,資料庫不一定要用傳統的...

資料結構 樹形結構

樹是一種表達資料之間層次關係的資料結構,樹中的每個節點有0個或者多個子節點,但只有乙個父節點,父節點為空的節點為根節點,一棵樹只有乙個根節點。樹結構的相關概念 數的度 乙個節點含有的子樹的個數成為該節點的度,一顆樹中最大的節點的度成為整顆數的度 葉節點 度為0的節點成為葉節點 根節點 沒有父節點的節...

樹形結構資料的提交

樹形結構資料提交問題 1 標記,關聯工作在jsp中進行 基於樹形結構提交資料的複雜關聯問題乙個控制項的name,value無法包含所有關聯資訊,自身資訊,故用隱藏域,由於隱藏域是統統提交,所以用隱藏域value作為key,能獲取被選中值的就是被選中了,所以組織隱藏域和選擇框資料的時候按照key va...