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