根据路径在闭包表中查找记录



我正在使用一个闭包表,就像这个答案一样(顺便说一句,很棒的答案):

文件系统中目录的分层/树数据库

您是否知道是否可以基于路径字符串获取具有单个查询的记录?

路径字符串将是用 / 分隔的列名。例如,这个问题的ROOT/Dir2/Dir4/Dir7应该让我得到Dir7记录。

在其基本形式中,闭包表仅包含传递连接的所有对。

若要在不递归的情况下回答查询,串联的路径字符串必须已经存在。

是否需要仅选择从根节点开始的路径?

您可以遵循以下两个选项之一:

  1. 将绝对路径存储为节点表中的附加列。
  2. 或者直接使用绝对路径作为节点的键,因此它们也是闭包表中的外键,你可以直接选择它们。

您是否需要相对于某个起始节点进行选择?

在这种情况下,您可以只将每个对的相对路径存储在闭包表中,例如,使其成为闭包(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)

最新更新