Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Хотя данные в таком виде уже более приспособлены сразу для вывода, но, как видите, главный недостаток такого подхода — необходимо достоверно знать количество уровней вложенности в вашей иерархии, кроме того, чем больше иерархия, тем больше JOIN'ов — тем ниже производительность.(про JOIN и про Adjacency List).
наиболее неприятной в данном алгоритме будет операция вставки узла в середину уже существующей структуры (между другими узлами), т.к. это повлечет изменение всех путей в нижележащих узлах. Хотя, справедливости ради, следует сказать, что такая операция окажется нетривиальной для любой модели хранения данных.
Другая тяжелая операция — это перенос одной ветки в другую.
CREATE TABLE cars (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE nodes (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE details (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO cars VALUES
(1, 'Машина1'),
(2, 'Машина2');
INSERT INTO nodes VALUES
(1, 'Узел1'),
(2, 'Узел2'),
(3, 'Узел3');
INSERT INTO details VALUES
(1, 'Деталь1'),
(2, 'Деталь2');
CREATE TABLE car_node (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`car_id` BIGINT NOT NULL,
`node_id` BIGINT NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO car_node VALUES
(1, 1, 1),
(2, 1, 2),
(1, 2, 1),
(2, 2, 3);
CREATE TABLE node_detail (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`detail_id` BIGINT NOT NULL,
`node_id` BIGINT NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO node_detail VALUES
(1, 1, 1),
(2, 2, 1);
Иерархические структуры данных и Doctrine