作者clifflu (缺钱啦 @@)
看板PHP
标题Re: 问实作上的问题 >"<
时间Tue Nov 15 17:14:48 2005
※ 引述《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