Re: [疑惑] 樹狀結構儲存於資料庫的方法?
※ 引述《remmurds (雷穆爾德‧小一)》之銘言:
: As title
: 如果有個樹狀結構(以公司的組織為例)長得像下面這樣:
: 公司┬部門(一)┬組別(一)
: │ └組別(二)
: ├部門(二)┬組別(三)
: │ └組別(四)
: └部門(三)┬組別(五)
: └組別(六)
: 而公司、部門和組別又有各自的屬性
: 在這種情況下
: 如果我想要在我的AP或WEB上顯示完整的樹狀結構
: 我的資料庫要怎麼規劃會最好呢?
: PS:
: 目前我想到的一個辦法是公司、部門和組別各自為一個table
: 然後以foreign key從組別指向該組別所屬的部門
: 該部門又以foreign key指向所屬的公司
: 請問各位覺得這樣的辦法有什麼要改善或可以做得更好的地方?
: 萬分感謝
這樣的做法當然不錯,至少是可行的. 前提是這樣的關聯是確定不
變的(公司<=部門<=組別). 如果是組織架構比較雜一點的, 又會
調整架構的, 可能需要額外的彈性. 我依個人的方式舉例, 例如:
公司
部門1
課別1
組別1
組別2
課別2
組別3
部門2
組別4
像上面的例子, 有的部門底下有課, 課下有組; 而有的部門底下
直接就是組, 沒有課. 如此一來, 原本的公司<=部門<=組別 的規
劃就不適用, 即使改成 公司<=部門<=課別<=組別 也不適用.
這時候可以考慮將所有的單位通通'抽象化'為'節點'. 節點之間
僅需維持的是上下階層關聯, 而每一個節點的實際資料結構則另
外再以 table 設計. 例:
節點: nodes: (id), parent_id, entity_name, entry_id, idx
1 0 coms 1 1
2 1 deps 1 1
3 2 clas 1 1
4 3 unts 1 1
5 3 unts 2 2
6 2 clas 2 2
7 6 unts 3 1
8 1 deps 2 2
9 8 unts 4 1
(id)是主鍵,
parent_id 是父節點的id, parent_id 為 0 代表沒有實體父節點,
意即是最上層的節點.
entity_name 是用來儲存節點屬性的資料表名稱,
entry_id 是儲存該節點屬性值的 entity_name 資料表下的記錄編號,
idx 是同一父節點下的節點們之間的兄弟順序.
公司: coms: (id), name, etc..
1 公司
部門: deps: (id), name, etc..
1 部門1
2 部門2
課: clas: (id), name, etc..
1 課別1
2 課別2
組: unts: (id), name, etc..
1 組別1
2 組別2
3 組別3
4 組別4
乍看之下感覺好像有點花, 實際上沒有想像中那麼複雜. 只要
抓住節點之間的父子關聯的概念, 剩下的公司,部門,課,組都是
順水推舟導出來而已.
至於如何展示這組織的樹狀關聯結構呢? 可以參考php板的這篇:
文章代碼(AID): #1BNMk6z_ (9080)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.115.151.184
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):