我正在使用一个闭包表,就像这个答案一样(顺便说一句,很棒的答案):
文件系统中目录的分层/树数据库
您是否知道是否可以基于路径字符串获取具有单个查询的记录?
路径字符串将是用 /
分隔的列名。例如,这个问题的ROOT/Dir2/Dir4/Dir7
应该让我得到Dir7
记录。
在其基本形式中,闭包表仅包含传递连接的所有对。
若要在不递归的情况下回答查询,串联的路径字符串必须已经存在。
是否需要仅选择从根节点开始的路径?
您可以遵循以下两个选项之一:
- 将绝对路径存储为节点表中的附加列。
- 或者直接使用绝对路径作为节点的键,因此它们也是闭包表中的外键,你可以直接选择它们。
您是否需要相对于某个起始节点进行选择?
在这种情况下,您可以只将每个对的相对路径存储在闭包表中,例如,使其成为闭包(ancestor_id int、descendant_id int、relative_path_between varchar)。用于构建闭包表的 INSERT 操作可以通过相应的 concat 表达式轻松扩展,例如,为具有相对路径 Z 的父 X 插入一个新的子 Y,您将这样做
insert into closure_table(ancestor_id, descendant_id, relative_path_between)
select ancestor_id,
<Y>,
relative_path_between || '/' || <Z>
from closure_table
where descendant_id = <X>
union all
select <Y>,<Y>,'';
(参见比尔·卡文的幻灯片,幻灯片 68 -- 78)