R2DBC邻接表获取全部children
R2DBC adjacency list get all children
我有一个 table,其中有 id
和 parentId
列:我将此结构称为邻接列表。
所以,现在我想获得所有 children 的任意 id。这个问题的经典解决方案使用递归,例如 here is Postgres procedure or CTE implementation.
我目前正在使用 Spring Webflux 和 Spring Data R2DBC + Postgres R2DBC 驱动程序(尚不支持存储过程)。
我怎样才能以反应式的方式解决这个问题?甚至有可能还是我遗漏了概念上的错误?
更新 1:
让我们想象一下我们有这样的数据:
+-------------+---------+
|id |parent_id|
+-------------+---------+
|root |NULL |
|id1 |root |
|dir1 |root |
|dir1_id1 |dir1 |
|dir1_dir1 |dir1 |
|dir1_dir1_id1|dir1_dir1|
+-------------+---------+
现在我想在 ReactiveCrudRepository 中使用一个方法,它将 return 所有 children 提供的 id。
例如,使用示例数据:通过提供 id='dir1',我想获得 ID 为 children 的 ['dir1_id1'、“dir1_dir1”、“ dir1_dir1_id1"].
我认为最好的 sql 方法是递归 CTE(通用 Table 表达式),您试过了吗?我从来没有尝试过很多行。
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
使用 proc 或 cte 与全扫描无关。
在你的情况下,你只需要使用递归 cte ,但在 id 上添加索引,parentid 肯定会有所帮助
create index idx_name on tablename (parentid , id);
10k 行也没有那么大,索引肯定会大大提高 cte。
我有一个 table,其中有 id
和 parentId
列:我将此结构称为邻接列表。
所以,现在我想获得所有 children 的任意 id。这个问题的经典解决方案使用递归,例如 here is Postgres procedure or CTE implementation.
我目前正在使用 Spring Webflux 和 Spring Data R2DBC + Postgres R2DBC 驱动程序(尚不支持存储过程)。
我怎样才能以反应式的方式解决这个问题?甚至有可能还是我遗漏了概念上的错误?
更新 1:
让我们想象一下我们有这样的数据:
+-------------+---------+
|id |parent_id|
+-------------+---------+
|root |NULL |
|id1 |root |
|dir1 |root |
|dir1_id1 |dir1 |
|dir1_dir1 |dir1 |
|dir1_dir1_id1|dir1_dir1|
+-------------+---------+
现在我想在 ReactiveCrudRepository 中使用一个方法,它将 return 所有 children 提供的 id。
例如,使用示例数据:通过提供 id='dir1',我想获得 ID 为 children 的 ['dir1_id1'、“dir1_dir1”、“ dir1_dir1_id1"].
我认为最好的 sql 方法是递归 CTE(通用 Table 表达式),您试过了吗?我从来没有尝试过很多行。
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 |
使用 proc 或 cte 与全扫描无关。
在你的情况下,你只需要使用递归 cte ,但在 id 上添加索引,parentid 肯定会有所帮助
create index idx_name on tablename (parentid , id);
10k 行也没有那么大,索引肯定会大大提高 cte。