回到我们之前的数据库字段设计,我们知道 parentid 可以和 id 字段结合来输出无限级分类的输出,还能用来表示节点间的关系。
这种设计用得很普遍,而且是最省存储空间,但是却不是最有效率的。比如现在我们有这么一个需求,需要查询指定深度节点时就会遇到问题。因为是采用递归(递归的效率你懂的)的方法,我们需要通过递归来逐层展开才能获取到所有该层的节点,然后再在其中进行查询实在既浪费时间又浪费空间。那么有没有更好的做法呢?
现在再来看看我的设计,增加了两个字段:depth 和 parentid_list。
depth 表示当前节点的深度的整数。
parentid_list 表示从根节点到当前节点的路径的字符串,采用节点名称不可能出现的字符作为分隔符。
现在输出树状结构:
观察层级关系字段 parentid_list,和深度字段 depth,维护它们其实并不会很费力,因为有迹可寻的,用程序自动维护也是可以的。但是在查询的时候这两个字段却能给我们带来很大的便利,比如我们需要查询所有第三层的节点:
mysql> SELECT * FROM categories WHERE depth = '3';
+----+---------------+---------+----------+---------------+-------