2

我有一个包含idparentId列的表:我将此结构称为邻接列表。
所以,现在我想得到任意 id 的所有孩子。这个问题的经典解决方案使用递归,例如这里是 Postgres 过程或 CTE 实现

我目前正在使用 Spring Webflux 和 Spring Data R2DBC + Postgres R2DBC 驱动程序(尚不支持存储过程)。
我怎样才能以反应式的方式解决这个问题?甚至有可能还是我错过了一些概念上的错误?

UPD 1:
让我们想象一下我们的数据如下:

+-------------+---------+
|id           |parent_id|
+-------------+---------+
|root         |NULL     |
|id1          |root     |
|dir1         |root     |
|dir1_id1     |dir1     |
|dir1_dir1    |dir1     |
|dir1_dir1_id1|dir1_dir1|
+-------------+---------+

现在我想在ReactiveCrudRepository中有一个方法,它将返回提供的 id 的所有孩子。

例如,使用示例数据:通过提供 id='dir1',我想获取具有 ids 的孩子:['dir1_id1', "dir1_dir1", "dir1_dir1_id1"]。

4

2 回答 2

2

我认为最好的 sql 方法是递归 CTE(通用表表达式),你试过了吗?我从来没有尝试过很多行。

WITH recursive nodes AS (
   SELECT id, parent_id
   FROM t
   WHERE parent_id = 'dir1'
   
   UNION ALL
   
   SELECT t.id, t.parent_id
   FROM nodes n
   INNER JOIN t ON t.parent_id = n.id
)

SELECT id 
FROM nodes;

parent_id = 'dir1' 的输出

ID
dir1_id1
dir1_dir1
dir1_dir1_id1
于 2021-06-05T23:27:04.093 回答
2

使用 proc 或 cte 与全扫描无关。

在您的情况下,您只需要使用递归 cte ,但是在 id, parentid 上添加索引肯定会有所帮助

create index idx_name on tablename (parentid , id);

10k 行也不是那么大,索引肯定会提高 cte 很多。

于 2021-06-06T00:58:36.823 回答