【问题标题】:R2DBC adjacency list get all childrenR2DBC邻接列表获取所有孩子
【发布时间】:2021-08-17 23:35:40
【问题描述】:

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

我目前正在使用 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"]。

【问题讨论】:

  • 如果你仍然可以使用递归 cte ,你不一定需要 proc
  • @eshirvana,是的,我可以,但是来自 PG Wiki 的 CTE 涉及对表进行全扫描(从 t 中选择 *),这可能只是一个临时解决方案。在我的用例中,邻接表可能非常大(> 10k 行)。
  • 你最好问一个更好的问题,确切地说你想要什么
  • 我的意思是提供样本数据和所需的输出
  • @eshirvana,我已经编辑了问题。

标签: postgresql spring-webflux spring-data-r2dbc r2dbc r2dbc-postgresql


【解决方案1】:

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

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

create index idx_name on tablename (parentid , id);

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2018-01-29
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多