|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Навеяно другой темой, про constraints и проверку данных на вшивость. Задана таблица EMPLOYEES с полями employee_id и manager_id типа integer. Таблица описывает строгую древовидную иерархию, с одним гендиректором наверху. Как в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Критерии правильности древовидности довольно очевидна но на всякий случай в вики есть определение: https://ru.wikipedia.org/wiki/Дерево_(структура_данных) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 02:41 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 03:34 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, На форуме ужн многократно обсуждалось, решения элементарные, а на современных версиях ещё легче. Но ты пиши, посмотрим... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 03:57 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Relic Hunter Код: plsql 1.
Лаконично. Похоже, что производится подсчет гендиректоров, из предположения что гендиректор помечен null. Это не единственный способ отметить гендиректора, но вполне рабочий. Для этого manager_id придется сделать nullable, расслабив одно из ограничений. Этот тест отловит таблицы где нет гендиректоров, или более одного гендиректора. Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
У меня пока тоже не получается записать эту задачу на SQL, т.к. мое решение полагается на цикл, а с циклами в SQL туго. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 06:08 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, проверить что все "узлы" employee_id в дереве и нет циклов? ps connect by, with ... .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 10:13 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
Пропустит, но не это. Это предотвращается а не проверяется. Например через FBI на EMPLOYEES(1 / (EMPNO - MGR)) или через calculated column X = EMPNO - MGR плюс check constraint CANT_SELFREPORT на X != 0. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:25 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY НеофитSQL Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
Пропустит, но не это. Это предотвращается а не проверяется. Например через FBI на EMPLOYEES(1 / (EMPNO - MGR)) или через calculated column X = EMPNO - MGR плюс check constraint CANT_SELFREPORT на X != 0. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:39 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Мне приятно, что есть желающие размять мозги и возможно, блеснуть кодом. Действительно, можно ввести проверку на eid != mid (давайте сократим эти поля employee_id и manager_id). Такая проверка исключит тривиальные циклы. Но пропустит более длинные. Контрпример: цикл из двух, не ловится вышеописанной проверкой. Код: plaintext 1. 2. 3. 4. 5.
В этом контрпримере, в "хорошей" таблице строчки 2-3 подчинены гендиректору, а в "плохой" таблице - друг другу (цикл). Цикл может быть из трех и более - нужно ловить все. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:48 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
кит северных морей а просто чек на empno != mgr? Brain fart SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:51 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL В этом контрпримере, в "хорошей" таблице строчки 2-3 подчинены гендиректору, а в "плохой" таблице - друг другу (цикл). Цикл может быть из трех и более - нужно ловить все. А это без сериализации не предотвращается а проверить можно только полным проходом по дереву. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:58 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL, проверить что все "узлы" employee_id в дереве и нет циклов? ps connect by, with ... .... stax Чувствуется человек с опытом работы - первым делом уточнил условия задачи. Дополнение к первому сообщению, более конкретные условия задачи: 1) гендиректор обозначается manager_id (mid) = null 2) пустая таблица не считается деревом 3) таблица из одного и более элементов может быть деревом (только гендиректор - считать деревом) 3) в дереве ровно один ген директор 4) циклы в графе запрещены - у дерева не бывает циклов 5) каждый сотрудник должен быть напрямик или через других подчинен гендиректору 6) результат функции или запроса должен говорить "дерево" или "не дерево" (true/false, 1/0, на усмотрение) 7) код должен отрабатывать за конечное время, быстрее - лучше Я заметил что в коммерческих решениях зачастую вершина дерева помечается как mid=eid, а не как mid=null. Думаю, что это делается с целью усиления constraints, тогда mid можно определить non-nullable внешний ключ. Если к этому добавить запрет на mid=eid для INSERT, будет невозможно испортить дерево при добавлении сотрудников. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:06 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Цикл может быть из трех и более - нужно ловить все. connect by нельзя пльзоваться? .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:09 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Тривиально: пройтись по всем записям, выстраивая иерархию от подчиненного к менеджеру. Обработать exception "connect-by loop in user data" либо проконтролировать соответствующий флаг. Отобрать листья. Сгруппировать листья и убедиться, что результатом группировки является единственная запись и эта запись соответствует корню иерархии. Фсьо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:19 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Можно пользоваться connect by, и любыми другими встроенными средствами Оракл. Если там есть встроенная команда проверки всего дерева, то это было бы самым правильным решением. Кстати, я не знал про существование connect by до этого момента, сейчас читаю как эта конструкция обрабатывает циклы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:39 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Уважаемый, уже несколько дней наблюдаю за Вашим творчеством. Не скрою,увлекательно. Продолжайте пожалуйста. Только огромная просьба: пожалуйста, ни в коем случае не изучайте выбранный технологический стек, не читайте документацию - от этого Ваши сообщения могут существенно потерять в лулзах. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:44 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Если там есть встроенная команда проверки всего дерева, В множестве типа "куча" нет деревьев, но можно хранить записи, имеющие логические ссылки на соседние. На этом всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:54 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
andrey_anonymous Тривиально: пройтись по всем записям, выстраивая иерархию от подчиненного к менеджеру. Обработать exception "connect-by loop in user data" либо проконтролировать соответствующий флаг. Отобрать листья. Сгруппировать листья и убедиться, что результатом группировки является единственная запись и эта запись соответствует корню иерархии. Фсьо. Это звучит как решение. Вряд ли я такое сегодня смогу написать на SQL. А вот connect-by/noloop - очень полезная штука, я о ней до этого не знал. С этим оператором задача упрощается в разы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:04 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL С этим оператором задача упрощается в разы. Не упрощается. В многопользовательском режиме (что есть стандарт) такая проверка (CONNECT BY) ничего не гарантирует. Без сериализации тут не обойтись. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:14 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLКак в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Составной ключ id+уровень иерархии, соответствующий FK и сверху chеck, проверяющий уровень иерархии менеджера выше, чем у работника. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:21 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY, Да что ж вы делаете-то... Остановитесь! Сейчас ещё одна же тема появится, теперь про уровни изоляции транзакций и мини-откаты... Прямо галопом по европам... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:23 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLКак в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Составной ключ id+уровень иерархии, соответствующий FK и сверху chеck, проверяющий уровень иерархии менеджера выше, чем у работника. Идея понятна, но уровень иерархии не определен для циклов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:29 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLуровень иерархии не определен для циклов. В дереве не существует циклов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:32 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY В многопользовательском режиме (что есть стандарт) такая проверка (CONNECT BY) ничего не гарантирует. Без сериализации тут не обойтись. SY. В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Я написал следующее условие, которое true если дерево, и false если не дерево. Оно использует connect by, оно сломается и даст неверные данные в многопользовательском режиме? Или вы говорите о ситуации, когда таблица меняется во время исполнения проверок? Если так, то добавим условие что таблицу считать статической на время проверки (напр., копия) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:51 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLуровень иерархии не определен для циклов. В дереве не существует циклов. Действительно. У дерева нет циклов, и ровно один корень. Условие этой головоломки - определить представляет ли таблица правильное дерево. Ваше предложенное решение начинается с "предположим, что это правильное дерево, где определен уровень иерархии.." :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:56 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Поскольку в однопользовательском вы будете работать исчезающе редко, лучше сразу прочитать Oracle Database Concepts, о чем вам уже несколько дней повторяют, и выкинуть свой устав, придя в этот монастырь. и не выдумывать фантастических ситуаций таблицу считать статической на время проверки (напр., копия) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:59 |
|
|
start [/forum/topic.php?fid=52&fpage=37&tid=1880888]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 465ms |
0 / 0 |