組織機構樹數據庫表設計


公司需要做一個組織機構管理的系統,但是現有的數據庫中存儲的方式,機構之間的關聯只是通過parent_id關聯的,這樣在查詢的時候需要不斷的遞歸查詢表數據,性能很差,邏輯也不清晰。所以在網上找到了幾種針對這種樹狀結構存儲,查詢插入的優化方法

1.發現幾種樹結構數據庫存儲方案

2.聊聊樹狀結構如何在數據庫中存儲

3.組織機構樹設計 

1.2兩種有點復雜了,第三個連接有一位答主介紹了一種快捷查詢的方法

 1 很麻煩的做法。
 2 簡單的只需要在原表里加一列就行了:
 3 
 4 組織機構簡潔字段設計:
 5 
 6 (ogran_code是組織機構唯一代碼,真正的系統里都會有這東西的)
 7 
 8 id,name,ogran_code,parent_id
 9 
10 快速查詢字段設計:
11 
12 id,name,ogran_code,parent_id,code_link
13 
14 (code_link是從根到該機構的整個code鏈條,例如: "root_code"+"first_code"+"child_code")
15 分隔符自定義即可
16 添加編輯機構時只關注該機構的父機構,在父機構的link上添加本機構的部分:  "pareat_code_link"+"local_code"
17 
18 任何查詢都可以通過這個字段快速完成。
19 
20 1,某機構所有子機構,查詢所有包含某機構CODE的CODE_LINK即可。可以使用like,超級簡單。
21 2,查詢Level,拆分該字段即可。
22 
23 總之,很方便記錄的一個鏈路LINK,可以做到任意需要遞歸才可以完成的查詢。

 

 

 用圖表分析了一下

 

  • 當插入(1總公司)

  id  code_link

  1  0_null_null

  • 在(1總公司)下插入(2上海分公司),總公司的child_code為2,上海分公司的root_code為1

  id  code_link

  1  0_null_2

  2  1_null_null

  • 在(1總公司)下插入(3深圳分公司),總公司的child_code為2,3,上海分公司的root_code為1

  id  code_link

  1  0_null_2,3

  2  1_null_null

  3  1_null_null

  • 在(2上海分公司)下插入(4徐匯辦事處),上海分公司的child_code為4,徐匯辦事處的first_code為2

  id  code_link

  1  0_null_2,3

  2  1_null_4

  3  1_null_null

  4  1_2_null

  • 在(2上海分公司)下插入(5閔行辦事處),上海分公司的child_code為4,5,閔行辦事處的first_code為2

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_null

  4  1_2_null

  5  1_2_null

  • 在(3深圳分公司)下插入(6人事部),深圳分公司的child_code為6,人事部的first_code為3

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6

  4  1_2_null

  5  1_2_null

  6  1_3_null

  • 在(3深圳分公司)下插入(7財務部),深圳分公司的child_code為6,7,財務部的first_code為3

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_null

  5  1_2_null

  6  1_3_null

  7  1_3_null

  • 在(4徐匯辦事處)下插入(8研發部),徐匯辦事處的child_code 為8,研發部的first_code為2,4(帶上徐匯辦事處的first_code 2)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  • 在(4徐匯辦事處)下插入(9市場部),徐匯辦事處的child_code 為8,9,市場部的first_code為2,4(帶上徐匯辦事處的first_code 2)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8,9

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  9  1_2,4_null

  • 在(9市場部)下插入(10市場調研小組),市場部的child_code為10,市場調研小組的first_code為2,4,9(帶上市場部的first_code)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8,9

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  9  1_2,4_10

  10   1_2,4,9_null

 

至此,查詢一個機構的子機構只需查詢root_code和first_code中含有此節點id的數據

例如,查詢(2上海分公司)的子機構,則為4,5,8,9,10

查詢(4徐匯辦事處)的子機構,則為8,9,10


  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM