Re: 問實作上的問題 >"<

看板PHP作者 (缺錢啦 @@)時間18年前 (2005/11/15 16:55), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《xamous (一天死去一點)》之銘言: : 大家好,我想做一個聯絡人的資料庫,每個聯絡人是一筆姓名、電話、 : 地址.... 等等的資料,可以讓使用者分群組管理。 : 使用者可以建立新群組,子群組,更該目前群組的名稱,刪除一個群組 : 以及底下子群組以及該群組下之聯絡人... 等等。 : 可是像這樣的系統要如何用 PHP + MySQL 實作呢?像我之前問過的另 : 外用一個資料表存群組結構,在聯絡人裡面加一個欄位記錄他的群組的 : 作法,要刪除群組的時候就變得很麻煩... 依照表格的正規化, 這麼做是應該的 : 有沒有比較適合這種情形的實作方法 >"< : 謝謝... 將資料與結構分離的作法: Users (使用者) : UID (Primary), GID_Root (INDEX), blah... Groups : GID (Primary), GID_Parent (INDEX), UID (INDEX) Contacts: CID (Primary), GID (INDEX), UID (INDEX) UserData, GroupData, ContactData : blah blah blah ... 綠色的部份是非必要的, 只是為了增加安全檢查效能而加上. 當然你也能夠利用它們來變出些什麼花樣, 利如在 Contacts / Groups 裡 對 UID 做選擇 (那就是 show all 了) (如果沒有這部份的需要, 那麼不做 Index 也沒關係 --- 你需要這麼省硬碟嗎 ? ) 所以當你要刪除一個 node (在此為 Group ) 時, 需要對該節點之 descent 做些處理. 若就你的需求來看, 是將被刪除節點的子節點們一併刪除, 因此很直觀的, 能夠得到一組遞迴的演算法: function delNodes (node) { if (node 有子節點) { 對所有 node 的子節點 s, 執行 delNodes(s) } 刪除 node (包含該筆 group 記錄, 以及其下之 Contact 記錄) } 你當然也可以透過類似的做法, 遞迴或者以迴圈方式取得該被刪除的 GIDs, 再一次砍光光. 何種做法會有較佳效能則視情況而定, 不過我偏好依賴 EXPLAIN 指令. 同樣的, 迴圈的做法能夠避免不知不覺的 new 出許多變數, 對於奇怪的群組 (像是繞圈圈的 Groups) 天生也有比較好的抵抗力 (多虧了 php 強大的 array, 使得除錯變得容易許多. 當然, 遞迴 + global 就搞 定了, 但你總該承認有些人天生就是討厭 global, 討厭寫遞迴的) 所以我會傾向用迴圈方式來解決問題. 剩下應該是你的工作了, 有問題再來問吧. 另外, 這種表格的讀取 (select), 能夠藉由適當的使用 join 以及 sub-query 來簡化工作, 這部份我也正在學習當中. -- 鬼壓床怎麼辦 騎上去啊 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.61.82
文章代碼(AID): #13UQ9h0H (PHP)
文章代碼(AID): #13UQ9h0H (PHP)