Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
Имеется желание сделать проверку на правильность ввода данных пользователями в древовидную таблицу tree(parentID,childID). Пока-что додумался до 2-х аномалий - подвисшие ветки и циклы. Вроде как, нет особых проблем в обнаружении подвисших веток - достаточно убедиться, что каждый узел имеет родителя (за исключением корневого узла). А вот как бороться с циклами ? Например если ввести что-то типа insert into tree values(1,2) insert into tree values(2,1) то получается полная ж. Тем более, что цикл может иметь много уровней вложенности... Кроме того, может еще какие аномалии существуют ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 18:55 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
С учетом того, что дерево суть связный граф без циклов (причем связностью обычно в задачах программистских пренебрегают, называя набор N деревьев одним деревом), никаких именно "деревянных" аномалий кроме циклов быть не может, все остальные аномалии наличием циклов так или иначе выявляются. Подвисшие ветки же - это уже из серии аномалий, связанные не с природой дерева как математического объекта, а нарушение ограничения целостности, т.е. аномалии "уровня СУБД" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 19:03 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
А циклы надо проверять при вводе, в смысле в триггерах. Это совсем не сложно сделать даже без рекурсии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 19:04 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
В случае цикла, при обходе, начиная с текущей вершины, рано или поздно снова придете к ней. Можно оформить функцией, с вызовом в CHECK CONSTRAINT... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 19:05 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
>>А циклы надо проверять при вводе, в смысле в триггерах в триггере к сожалению нельзя, дерево может вводиться в любой последовательности, главное что-бы результат оказался верным, это должно проверяться потом, когда из этого дерева будет формироваться другая структура... В общем, если от каждого узла подниматься вверх - то обязательно должен дойти до корня, а если дошел до первоначального узла - значит цикл, если вообще до корня не дошел - подвисшая ветка... Спасибо. >>это уже из серии аномалий, связанные не с природой дерева как математического объекта, а нарушение ограничения целостности А почему ? Я думал это как раз аномалия дерева, самой-то СУБД по-сути все-равно, какой узел с каким соединен, и соединен-ли с вершиной... кстити извиняюсь, что не в тот форум запостил, хотел в Проектирование СУБД, может модераторы перенесут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 20:15 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
Ну с точки зрения дерева строк как математического объекта ситуация, когда ребро указывает неведомо куда (а пара ObjectID + ParentID - это по сути ребро графа), просто невозможна. Насчет "нельзя проверить при вводе" - это не так. Если при проверке в триггере двигаться не только вверх, но и вниз, можно любые некорректные ситуации определить именно при вводе. Даже в случае, когда, как я понимаю, потомок может оказаться в базе раньше предка - да, в этом случае ошибка возникнет не в добавляемом объекте, а в каком-то из его предков, но это не мешает не давать возможности создавать такие строки. Главное, как это говорят в армии, в данном случае - не сделать, а доложить, т.е. не просто обнаружить ошибку, а так сформулировать сообщение об ошибке, чтобы пользователь понял, в чем дело, и мог разобраться либо инициировать разбирательство :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 21:41 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
StalkerSИмеется желание сделать проверку на правильность ввода данных пользователями в древовидную таблицу tree(parentID,childID). Пока-что додумался до 2-х аномалий - подвисшие ветки и циклы. Вроде как, нет особых проблем в обнаружении подвисших веток - достаточно убедиться, что каждый узел имеет родителя (за исключением корневого узла). А вот как бороться с циклами ? Например если ввести что-то типа Сначала надо решить, что у Вас дерево или граф. Не факт, что корень должен быть один... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 08:44 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
очень тяжело делать обработку деревьев когда сервер базы не поддерживает рекурсивные запросы и когда нет триггеров на запись, а только на стэйтмент. Кодирование превращается в сущий кошмар. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 11:52 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
gardenmanочень тяжело делать обработку деревьев когда сервер базы не поддерживает рекурсивные запросы и когда нет триггеров на запись, а только на стэйтмент. Кодирование превращается в сущий кошмар.есть куча методов ведения "SQL-ного" древа (или леса). Например ведение не ссылок на предков, а на "левого/правого по обходу", или же текстового (мемо) поля с полной иерархией узла, или таблицы всех иерархических связей узла. Понятно, что все это избыточно и затратно, но работает с "простыми" SQL конструкциями (и при этом автоматом поддерживает отсутствие колец). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 12:11 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
4321[quot gardenman]или же текстового (мемо) поля с полной иерархией узла. А ну-ка перепоlчините одну ветку - другой... :)) Любопытно взглянуть на количество кода, которое придется нарисовать при этом, а так же на производительность этого чуда :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 12:37 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
gardenman 4321[quot gardenman]или же текстового (мемо) поля с полной иерархией узла. А ну-ка перепоlчините одну ветку - другой... :)) Любопытно взглянуть на количество кода, которое придется нарисовать при этом, а так же на производительность этого чуда :)Я делал несколько другой случай - триггера для заполнения "полной таблицы связей" в постгресе (т.е. "на каждую запись". Делал без использования касадного срабатывания триггеров (т.е. запись в таблице дерева отрабатывала свой триггер, правя ВСЕ порождаемые этим изменения таблицы связей SQL конструкциями (на основе той же самой таблицы связей)). При вставке/редактировании отдельных записей пользователями работает приемлемо. Наиболее критичны массовые вливы/апдейты данных какой-нть приладой. Кода "изрядно" (по полстранички на адд -2 инсерта, и 3/4 - на апп - несколько дилетов и инсертов). Но "полчаса потерять" - а дальше можно код просто юзать для других деревьев.. Для текстовой иерархии в поле очевидно порождение каскадного срабатывания триггеров (если поле в той же таблице) "на запись". От этого мне хотелось уйти. Можно наверное иерархию держать в таблице связанной 1-1. Но мне не улыбалось писать Лайки (они у постгреса как-то криво работают со стандартными индексами, а я был "не в теме"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 13:11 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
gardenman 4321[quot gardenman]или же текстового (мемо) поля с полной иерархией узла. А ну-ка перепоlчините одну ветку - другой... :)) Любопытно взглянуть на количество кода, которое придется нарисовать при этом, а так же на производительность этого чуда :) Дык это один раз написать, зато потом выборки будет несравнимо проще и быстрее чем с рекурсивными запросами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 14:05 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
Собственно, не зря метод Джо Селко является популярным, очень сильно увеличивает скорость запросов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 15:45 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
авторДык это один раз написать, зато потом выборки будет несравнимо проще и быстрее чем с рекурсивными запросами а вы в курсе, что такое переключение контекстов ? И, интересно где на каких серверах и на таблицах какого объема вы сравнивали рекурсивные запросы с хранимками? :)) Может вы хотябы в курсе как формируется план запроса у хранимки? И что такое расщепление ХП и зачем оно нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 16:00 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
gardenman авторДык это один раз написать, зато потом выборки будет несравнимо проще и быстрее чем с рекурсивными запросами а вы в курсе, что такое переключение контекстов ? И, интересно где на каких серверах и на таблицах какого объема вы сравнивали рекурсивные запросы с хранимками? :)) Может вы хотябы в курсе как формируется план запроса у хранимки? И что такое расщепление ХП и зачем оно нужно? Что такое переключение контекстов и расщепление ХП не в курсе, тем более зачем оно нужно. Но если вы считаете что можно как-то быстрее найти записи чем выбрав их стандартным запросом непосредственно по индексу - расскажите как это может быть. И причем тут хранимки? Я про них ни слова не писал, хотя как примерно формируется план запроса в курсе(в очень общих чертах). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 18:56 |
|
||
|
Деревянные аномалии
|
|||
|---|---|---|---|
|
#18+
gardenman а вы в курсе, что такое переключение контекстов? ... Может вы хотябы в курсе как формируется план запроса у хранимки? И что такое расщепление ХП и зачем оно нужно? а какие еще умные слова вы знаете ? Никогда не слышал о таком понятии в mssql как расшепление ХП, обьясните скорее, а то все это выглядит распальцовкой типа "Вы знаете что такое ковергенция корреляции скалярного поля ? Нет ? Ну и тупые же вы все, не то, что я" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2005, 10:33 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=33219132&tid=1553799]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 179ms |
| total: | 297ms |

| 0 / 0 |
