Избавиться от круговой родитель / ребенок в MYSQL

У меня есть такая таблица:

 Attribute  |  Type   | Modifier
------------+---------+----------
id         | integer | not null
title      | text    | not null
parent     | integer |

parent поле является внешним ключом, ссылающимся на ту же таблицу.

Как я могу гарантировать, что никакие циклы (круговые родительские / дочерние ссылки) никогда не вставляются? Например:

 id         | title   | parent
------------+---------+----------
1          | A       | 3 or 2
2          | B       | 1
3          | C       | 2

Я использую PHP и MySQL.

3

Решение

Сначала предположим, что в таблице изначально нет петель. Если это так, то вам нужно будет исправить любые петли вручную. Затем, когда вы пытаетесь установить родителя для ребенка, сначала выберите потенциального родителя ребенка. Затем продолжаю выбирать родителя родителя. Если вы достигли узла, у которого нет родителя, тогда все в порядке, и вы можете установить родителя ребенка. Если вы достигнете дочернего элемента, то вы знаете, что цикл будет создан, если вы установите этот родительский элемент.

function canSetParent($child, $parent)
{
$node = $parent;
while($node != null)
{
if($node->id == $child->id) return false;  //Looped back around to the child
$node = $node->parent;
}
return true;  //No loops found
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]