Postgres рекурсивный поиск LTREE - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующие две таблицы, которые представляют иерархию вложенных папок

Таблица «Папка» содержит основную информацию c Информация о папке

+----+--------------+
| id |     name     |
+----+--------------+
|  1 | Top          |
|  2 | Science      |
|  3 | Astronomy    |
|  5 | Astrophysics |
|  6 | Cosmology    |
+----+--------------+

Таблица «Папка_дерево» содержит структуру иерархии, используя идентификаторы папок и путь к столбцу типа LTREE.

+----+--------+---------+
| id | folder | path    |
+----+--------+---------+
| 32 | 1      | 1       |
| 33 | 2      | 1.2     |
| 36 | 3      | 1.2.3   |
| 37 | 4      | 1.2.3.4 |
| 38 | 5      | 1.2.3.5 |
+----+--------+---------+

Я ищу, чтобы проверить, существует ли точная структура папки, когда дан массив структуры, например, как проверить ['Top', ' Наука »,« Астрономия »,« Астрофизика »] в таком порядке.

Я полагаю, что рекурсивный запрос может сработать, когда он сначала смотрит на папку root« Верх », а затем спускается к Астрофизике, подтверждая, что каждая папка существует по пути.

Может ли это быть достигнуто с помощью рекурсивного запроса? Или похожие?

Я понимаю, что путь к папке folder_tree может содержать имена полностью, например, Top.Science.et c, но в этом случае имена папок содержат пробелы и символы, которые не разрешены в LTREE.

1 Ответ

0 голосов
/ 28 апреля 2020

Это не ответ, а комментарий, который не помещается в разделе комментариев

PostgreSQL "ltree" предназначен для быстрого поиска и поиска. Это не типичное решение для модели реляционной базы данных, которую необходимо модифицировать атомарно, без блокировок и избежать проблем параллелизма при модификации.

Если бы это было решение № SQL, все было бы в порядке. Однако в реляционном моделировании вы бы избежали избыточности. Например, две ваши таблицы могут быть смоделированы в одну:

+----+--------------+--------+
| id |     name     | parent |
+----+--------------+--------+
|  1 | Top          |   null |
|  2 | Science      |      1 |
|  3 | Astronomy    |      2 |
|  5 | Astrophysics |      3 |
|  6 | Cosmology    |      4 |
+----+--------------+--------+
...