У меня есть такая таблица:
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.
Сначала предположим, что в таблице изначально нет петель. Если это так, то вам нужно будет исправить любые петли вручную. Затем, когда вы пытаетесь установить родителя для ребенка, сначала выберите потенциального родителя ребенка. Затем продолжаю выбирать родителя родителя. Если вы достигли узла, у которого нет родителя, тогда все в порядке, и вы можете установить родителя ребенка. Если вы достигнете дочернего элемента, то вы знаете, что цикл будет создан, если вы установите этот родительский элемент.
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
}
Других решений пока нет …