2. Древовидная структура в PostgreSQL. SQL CommonДревовидная структура в PostgreSQL. SQL Common
Table ExpressionTable Expression
(Алексей Кутепов, (Алексей Кутепов, Revel Systems iPad POSRevel Systems iPad POS))
7. WITH Queries. Common Table Expression (CTE)
•
В стандарте SQL-99
•
Поддеживается PosgreSQL, Oracle 11g, Microsoft SQL
Server, …
•
Не поддерживается MySQL, SQLLite
•
CTE вводит вспомогательный statement, который
можно представить как временную таблицу, которая
существует только для одного, последующего сразу за
ним запроса.
8. •
WITH RECURSIVE - Using RECURSIVE, a WITH query can refer to
its own output.
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
“Note: Strictly speaking, this process is iteration not recursion,
but RECURSIVE is the terminology chosen by the SQL standards
committee.”
9. Свойства Adjacency List:
•
Легко получать поддерево используя CTE
WITH RECURSIVE resources_cte_tree(id, parent_id, name, depth) AS (
SELECT *, 0 AS depth FROM resources WHERE parent_id = 5
UNION ALL
SELECT r.*, rct.depth+1 AS depth FROM resources_cte_tree rct
JOIN resources ON (rct.id = resources.id)
)
SELECT * FROM resources_cte_tree;
11. Свойства Path Enumeration (Breadcrumbs thumbsup):
•
Легко вставлять элементы.
•
Легко получать непосредственных потомков/предков
•
Легко получать поддерево
•
Затратно перемещать поддерево
SELECT * FROM resources r_left LEFT JOIN resources r_right
ON (r_left.id = r_right.parent);
SELECT * FROM resources WHERE path LIKE ‘/room/1/%’;
INSERT INTO resources (name) VALUES (‘Rack ’) RETURNING id;
SELECT path as parent_path FROM resources WHERE id = 1;
UPDATE resources SET path = parent_path || ‘/’ || id;
12. Nested Sets
•
Каждый ресурс «кодирует» свои дочерние ресурсы 2
ключами-числами:
•
«Левое» число ресурса всегда меньше чем левое число его
потомков
•
«Правое» число ресурса всегда больше, чем «правое» число
его потомков
14. •
Nested Sets
id left_key right_key name
1 1 12 Room 1
2 2 7 Server 1
3 8 11 Server 2
4 3 4 Cluster 1
5 5 6 Cluster 2
6 9 10 Cluster 3
15. Свойства Nested Sets:
●
Легко получать поддерево потомков/предков
●
Трудно получить непосредственных предков/потомков (рецепт –
добавить поле parent_id и/или depth)
●
Трудно вставлять элемент
●
Трудно перемещать дерево
●
Можно хранить только одно дерево в одной таблице
SELECT id, name FROM resources WHERE left_key >= $left_key AND right_key
<= $right_key ORDER BY left_key
SELECT id, name, level FROM resources WHERE left_key
<= $left_key ANDright_key >= $right_key ORDER BY left_key
17. Свойства Closure Table
•
Легко запрашивать прямых потомков/предков
•
Легко вставлять новые элементы
•
Легко удалять элементы
•
Трудно запрашивать поддерево
SELECT r.* FROM resources r JOIN resources_tree t ON (r.id = t.child_id)
WHERE r.id = 1;
SELECT r.* FROM resources r JOIN resources_tree t ON (r.id = t.parent_id)
WHERE r.id = 1;
INSERT INTO resources (name) VALUES (‘Room 3’) RETURNING id;
INSERT INTO resources_tree (parent_id, child_id) VALUES (NULL, id);
DELETE FROM resources_tree WHERE parent_id = 1;
DELETE FROM resources WHERE id = 1;
19. Запрос прямых
потомков
Запрос
поддерева
Вставка нового
элемента
Изменение
поддерева
Adjacency List Легко Трудно* Легко Трудно
Path Enumeration Легко Легко Легко Трудно
Nested Sets Трудно** Легко Трудно Трудно
Closure Table Легко Трудно*** Легко Легко
* Легко, при использовании SQL CTE
** Легко, при введении полей parent_id и/или depth
*** Легко, при использовании SQL CTE, либо при добавлении ссылок к каждому потомку (не
всегда возможно)
20. Hierarchical and recursive queries in SQL
CONNECT BY is supported by EnterpriseDB,
Oracle database, CUBRID, IBM Informix
and DB2
21. Informative links:
Slides by Bill Karwin (of course):
http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back/
http://www.slideshare.net/billkarwin/models-for-hierarchical-data
Nested Sets:
http://www.getinfo.ru/article610.html
Closure Table:
https://habrahabr.ru/post/263629/
https://
en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL