"Tonal" ...

Разминался тут с деревами, и задумался о том, что положить дерево в таблички мы могём, выбрать теперь тоже запросто (СТЕ - рулит), а вот гарантировать, что в нашем дереве нет циклов так просто не получится... :-(

   Это смотря как дерево делать.

Надо при изменении или всю таблицу лочить (что жалко), или всё дерево - что 
чревато дедлоками...
Да и код таких проверок не самый прямой и наглядный.

   Выноси (или дублируй) все связи parent->child всех уровней в отдельную 
таблицу
и делай там PK\UK. Перед вставкой {a, b} пробуй вставить {b, a} - если 
получилось,
значит цикла нет и после вставки {a, b} можно удалять {b, a}.

   Не знаю, насколько такая схема жизнеспособна :)

Вот бы было бы здорово, чтобы сервер можно попросить организовать подобные проверки так же, как он отслеживает уникальность в индексах.
Что-то типа:
ALTER TABLE TABLE_NAME ADD CONSTRAINT FK_NAME FOREIGN KEY (PARENT_ID) SELF_REFERENCES (ID) NOT CYCLE_REFERENCE [ON DELETE CASCADE];

   И как ты себе представляешь реализацию подобного внутри сервера ?

Влад

Ответить