Есть ли способ реализации дерева ADT в php и mysql? - PullRequest
1 голос
/ 19 ноября 2011

Есть ли способ хранения и работы (добавление, удаление и т. Д.) С древовидной структурой данных в PHP и Mysql?

Может ли PHP RecursiveItrator Itrator быть здесь полезным?

Поэтому в основном я хочу иметь древовидные структуры, чтобы хранить некоторые иерархии, такие как категории некоторых продуктов, которые могут продолжаться бесконечно. Было бы очень хорошо иметь возможность хранить все в базе данных, извлекать их и делать в них простые вещи, такие как обходы BFS и DSF..

1 Ответ

2 голосов
/ 19 ноября 2011

Хороший способ получить все узлы для данного дерева при использовании списка смежности - добавить столбец в каждую строку с именем root_id или чем-то еще, чтобы каждый узел знал не только своего непосредственного родителя, но и верхний узел.в своем дереве.

CREATE TABLE Comments (
  comment_id INT PRIMARY KEY,
  root_id INT,
  parent_id INT,
  FOREIGN KEY (root_id) REFERENCES Comments (comment_id),
  FOREIGN KEY (parent_id) REFERENCES Comments (comment_id)
);

Так что, если у вас иерархия 10 -> 20 -> 30, вы должны хранить следующее:

INSERT INTO Comments SET comment_id = 10, root_id = 10;
INSERT INTO Comments SET comment_id = 20, root_id = 10, parent_id = 10; 
INSERT INTO Comments SET comment_id = 30, root_id = 10, parent_id = 20; 

Это похоже на то, как Slashdotнапример, хранит деревья комментариев.

Если вы можете написать запрос для выборки всех узлов данного дерева, и каждый узел знает своего непосредственного родителя, в стиле списка смежности для хранения иерархических данных,вы можете преобразовать набор результатов запроса в многомерный массив или дерево объектов при получении.

См. мой ответ на Преобразование плоского массива в многомерный для кода, который делает это вPHP.

...