Re: 問實作上的問題 >"<
※ 引述《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
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章