Возможно, вас заинтересует решение «Materialized Path», которое немного де-нормализует таблицу, но может использоваться в любом типе базы данных SQL и не позволяет выполнять рекурсивные запросы Фактически, его можно использовать даже в базах данных без SQL.
Вам просто нужно добавить столбец, который содержит всю родословную объекта. Например, приведенная ниже таблица содержит столбец с именем tree_path
:
+----+-----------+----------+----------+
| id | value | parent | tree_path|
+----+-----------+----------+----------+
| 1 | Some Text | 0 | |
| 2 | Some Text | 0 | |
| 3 | Some Text | 2 | -2-|
| 4 | Some Text | 2 | -2-|
| 5 | Some Text | 3 | -2-3-|
| 6 | Some Text | 3 | -2-3-|
| 7 | Some Text | 1 | -1-|
+----+-----------+----------+----------+
Выбор всех потомков записи с id = 2 выглядит следующим образом:
SELECT * FROM comment_table WHERE tree_path LIKE '-2-%' ORDER BY tree_path ASC
Чтобы построить дерево, вы можете отсортировать по tree_path
, чтобы получить массив, который довольно легко преобразовать в дерево.
Вы также можете индексировать tree_path
, и индекс можно использовать, когда подстановочный знак не в начале.
Например, tree_path LIKE '-2-%'
может использовать индекс, а tree_path LIKE
% - 2-'не может.