javaeye:关系型数据库表设计,如何保存树状结构数据? 我有我见解。

阅读更多
链接: http://forum.iteye.com/viewtopic.php?t=15829

这是一个很有趣的东西,无限分类问题。

这里涉及到沉余数据的问题,如果不这样做,我们没法很快的对数据进行搜索。

我的方法是,在表中加入layerpath,用特别的符号分隔id;加入parentlayer,用来标记父节点;加入level,用来表示这是第几层(这个可以不要,实际应用中几乎没用,反而加大了修改layer的难度)。

这样做的优点是把搜索的重任交给了数据库,比如说查找某个节点下的所有子节点,包括继承子节点,我们就可以用一刀切的方式取得,而不用遍历树的方法,比如我的layerpath的格式如下:
|1|3|7|8|
我要查找id为1的所有子节点及继承子节点:
SQL:select * from craft where layerpath like '%|1|%';

而修改一个节点的上下文关系时,仅仅只要修改一个parentlayer就行,当然,我们要在修改更新时检查节点的继承关系(这是最重要的)。

当然,这样的设计也会有缺点,当类别数据量太多时,就会让数据库吃不消,就比如电信的电子黄页,就有一千多个类别,至少四层,特别是在搜索时,系统的很容易挂掉。解决方法唯有是用缓存。

你可能感兴趣的:(数据结构,电信,PHP,SQL)