很多时候的表设计过程中都涉及到树形结构,尤其是组织机构用到的更多。往往最让人头疼的就是查询一个节点的下面所有子节点,或是根据这个节点找到所有父节点。接下来就看看如何不用递归实现该查询。
原理
在每个节点原有的基础上添加两个属性,即leftIdx,rightIdx。也就是上图上每个节点的左右角标。那有些朋友就疑问了,这些角标是怎么确定的呢?角标的生成规则:从上到下,从左到右,依次递加
查询所有子节点
以“朝阳”为例:select * from sys_org t where t.left_idx>9 and t.right_idx<16
其中sys_org是数据库对应的组织机构表,left_idx和right_idx为左右角标的字段。
查询所有父节点
以“凌源”为例:select * from sys_org t where t.left_idx<10 and t.right_idx>15
代价
既然查询方便,那就意味着它在其他方面的不足,比如新增、修改和删除。每次节点的改动,都需要修改后续节点的角标,这个是必须要考虑的一个问题。若机构不常变动,采用此方式还是方便许多。