我以前做過類似問題既做法係: (Staff, Ancestor) 結構, 用番樓主既例子
(A, A)
(B, A)
(B, B)
(C, A)
(C, B)
(C, C)
咁要數C係第幾層, 就只要 select count(*) from XXX where staff='C'
呢個方法亦避免左#6 既問題
要加個B1係B同C之間, 只需要insert record, 唔使update
Algorithm 係 :
1. 為新staff 既每個上司同自己加一個record. 即加入
(B1, A)
(B1, B)
(B1, B1)
可以用二句SQL 做到
insert into XXX (staff, ancestor) select 'B1', ancestor from XXX where staff='C' /* C is the one being replaced */
insert into XXX (staff, ancestor) values ('B1', 'B1')
2. 為每個下屬加一個record, 即加入.
(C, B1)
可以用一句SQL 做到
insert into XXX (staff, ancestor) select staff, 'B1' from XXX where ancestor='C'
要移除一個staff, 只需要以下既SQL
delete from XXX where staff='B1' or ancestor='B1'
唔鍾意"or" 既 分兩句亦得.
要數下有幾多下屬都可以用一句SQL 搞掂
select count(*)-1 from staff where ancestor='B'
呢個結構既好處係可以用固定數目既SQL statement 做任何加減動作, 亦充份利用database index, 唔會涉及table scan 動作, 快速讀取資料....
[ 本帖最後由 thinkpanda 於 2008-11-14 11:11 編輯 ] |