我们在业务中经常要处理树形结构的数据,比如目录树、组织关系、血缘关系等。那么在关系型数据库中如何高效维护并查询树形结构呢?
下面将介绍并对比常见的三种树形结构的存储方案,供大家选择
假设我们需要存储这样的组织架构
路径树存储 Path Block
也称前缀树,即用从根节点到当前节点的路径来表示节点在树中的位置,其表结构示例为:
CREATE TABLE path_block_tree (
id SERIAL PRIMARY KEY,
path VARCHAR(100000), -- 树路径
parent_id BIGINT UNSIGNED,
FOREIGN KEY (parent_id) REFERENCES adjacency_block_tree(block_id)
);
其中 path 字段就是树路径,从根节点到当节点路径树上每一个节点 ID 都用"/"连接在一起。
查询
如果要查询某个节点向上的根路径或者所有的子节点,可以直接根据 path 字段进行拼配,SQL简单高效。当然为了提高查询效率,path 字段需要加索引。
-- 根路径 向上
SELECT *
FROM path_block_tree AS c
WHERE '2/23/231/' LIKE concat(c.path,'%');
-- 子树 向下
SELECT *
FROM path_block_tree AS c
WHERE c.path LIKE concat('