Таблица закрытия MySql не будет поддерживать повторяющиеся подкатегории для разных родителей.

Я некоторое время ходил по кругу с этим закрывающим столом. У меня проблема со вторым вхождением потомка. У меня есть экземпляры подкатегорий, которые появляются более чем в одной родительской категории. Я вернулся к этому примеру для простоты:

drop table if exists closure;
drop table if exists nodes;

create table nodes (
node int auto_increment primary key,
label varchar(20) not null
);

insert into nodes (node, label) values
(1, 'rootree'),
(2, '1stbranch'),
(3, 'midbranch'),
(4, 'corebranch'),
(5, 'leafnodes'),
(6, 'lastbranch'),
(7, 'lastleaf');

create table closure (
ancestor int not null,
descendant int not null,
primary key (ancestor, descendant),
foreign key (ancestor) references nodes(node),
foreign key (descendant) references nodes(node)
);

insert into closure (ancestor, descendant) values
(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7),
(2,2),
(3,3), (3,4), (3,5),
(4,4), (4,5),
(5,5),
(6,6), (6,7),
(7,7);

Используя следующий запрос, я могу получить желаемые результаты:

select group_concat(n.label order by n.node separator ' -> ') as path
from closure d
join closure a on (a.descendant = d.descendant)
join nodes n on (n.node = a.ancestor)
where d.ancestor = 1 and d.descendant != d.ancestor
group by d.descendant;

ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ:

rootree -> 1stbranch
rootree -> midbranch
rootree -> midbranch -> corebranch
rootree -> midbranch -> corebranch -> leafnodes
rootree -> lastbranch
rootree -> lastbranch -> lastleaf

Но если я добавлю еще один дочерний элемент, например, уже существующий дочерний элемент, я хочу сделать leafnodes дочерним элементом roottree -> lastbranch -> lastleaf

Вставляю в замыкающую таблицу две новые записи: (6-5) и (7-5)

Тогда весь ад разверзнется. Я пробовал все, что мог придумать, но я никуда не денусь.


person Rob    schedule 20.08.2012    source источник
comment
Нет. Это просто портит ситуацию по-другому.   -  person Rob    schedule 21.08.2012
comment
Мой предыдущий комментарий был ответом на вопрос, не должен ли я вместо этого вставить (5-6) и (5-7). Я не знаю, почему он исчез, но я обещаю, что разговаривал не только с собой.   -  person Rob    schedule 21.08.2012


Ответы (1)


Я нашел ответ здесь: Преобразование Таблица закрытия из слабой сущности

ОТВЕТ: я добавил два поля в замыкающую таблицу для хранения идентификаторов предка и потомка. Теперь узлы не зависят от фактических значений. Структура остается связанной и используется для вставки, удаления, запросов и т. д., но значения, которые сохраняются в каждом узле, являются их собственными объектами и могут быть заменены любыми другими, не затрагивая структуру дерева. Это позволило мне решить мою конкретную проблему, связанную с использованием одной и той же дочерней категории в нескольких родительских категориях. Я ожидаю, что есть много других преимуществ, которые еще предстоит открыть.

person Rob    schedule 23.08.2012
comment
Не совсем понял ваш ответ. Ссылка, которую вы разместили, говорит о создании доц. стол между основанием и крышкой. Но вы говорите о добавлении идентификатора предка и потомка к закрытию, которое у него уже есть. (?) - person profitehlolz; 18.09.2012