組織機構樹型資料庫結構

2021-07-05 04:44:00 字數 1394 閱讀 1724

之前做的乙個系統,裡面涉及乙個組織機構,之前也做過,之前做得非常簡單普遍

資料庫表結構主要是乙個主鍵id,名稱name,乙個父級外來鍵parent_id

比如id  name         parent_id

1  汕頭公司     null

2  計算機中心  1

3 人事部           1

類似這樣,相信大家都能想到,新增,修改都很方便,但查詢就出現乙個問題,就是比如你想得到汕頭公司裡面的員工,包括子部門的話,就必須得用遞迴,遞迴這東西,想起來很傷腦的,如果層數比較多,資料量比較大的話還非常耗效能的。

後面我想了另乙個資料庫結構,也是比較通俗易懂,適合我這麼笨的人。

我直接上資料吧,相信比我聰明的人一看就知道了。

如圖,我主要是增加了乙個parent_ids這個字段,這個字段主要記錄了,當前的部門上級部門總共有哪些部門。

那麼當你要查詢時,你可以這樣,比如你要查詢汕頭公司(id 為149)以下包括子部門所有的員工

select e.* from employee e inner join org o on e.org_id=o.id where o.id=149 or find_in_set(149,o.parent_ids);
這樣裡面用的是like 可能效率不高,但至少不用遞循了,也比較容易理解。

如果你要移動的話,這個可能理解起來有點麻煩,我一開始也是忽略其中一些小問題,導致移動位置時parent_ids出錯了

比如你要移動汕頭公司(id為149)到上海公司(id為148)裡面

最好用事務處理

首先查詢到上海公司的parent_ids為1,,那麼汕頭公司的parent_ids就為1,148,了

update org set parent_ids='1,148,',parent_id=148 where id=149
然後還得更新汕頭公司所有子部門的parent_ids

update org set parent_ids=concat('1,148,',substring_index(parent_ids,'1,',-1)) where find_in_set(149,parent_ids);
這一步可能很多同學看不懂,我剛開始也忽略了這一步,後面移動位置時,parent_ids就出錯了。

懂了查詢跟修改,那刪除也是比較簡單的

delete * from org  where o.id=149 or find_in_set(149,parent_ids);
新增就更簡單了,這兒就是寫了。

希望對大家有用處。

組織機構樹查詢

組織機構樹遞迴查詢 查詢父級節點的所有子節點 select organizational id,organizational name,parent id from sys organizational where is used 1 start with parent id 父級節點id conn...

java 遞迴查詢組織機構樹

需求 不要在資料庫層寫儲存過程或者呼叫資料庫自帶方法實現,因為資料庫有可能是mysql或者是oracle。核心遞迴 description 遞迴查詢機構 param param departlist param param departid 設定檔案 return void 返回型別 throws ...

SQL遞迴查詢實現組織機構樹

系統用到的組織機構樹,要實現對當前節點以及其子節點的查詢,資料庫sql要用到遞迴查詢,這也是我第一次接觸sql的遞迴查詢。先說一下什麼是遞迴查詢,簡單說來是將乙個樹狀結構儲存在一張表裡,比如乙個表中存在兩個字段 code,parent code,那麼通過表示每一條記錄的parent是誰,就可以形成乙...