【问题标题】:Get rid of circular parent/child in MYSQL摆脱 MYSQL 中的循环父/子
【发布时间】:2015-06-09 00:01:26
【问题描述】:

我有一张这样的桌子:

 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。

【问题讨论】:

  • 我的英语不太好,假设我想创建一个父/子类别列表,当我试图获取某个类别的父级时,如果发生这种情况,系统会挂起和 php将陷入无限循环
  • 好的,那么当有人试图插入一条导致循环的记录时,您希望发生什么?
  • 我想防止这种情况发生
  • 为了防止循环发生,您只需检查何时移动树中具有子节点的节点。对于要移动的节点,检查新的父节点是否是后代(子节点,或子节点的子节点,或子节点的子节点......)。如果是,则中止。如果不是,则不会发生循环。

标签: php mysql parent-child hierarchical-data circular-reference


【解决方案1】:

首先,假设表格最初没有循环。如果是这样,那么您将需要手动修复任何循环。然后,当您尝试为孩子设置父母时,首先获取孩子的潜在父母。然后继续获取父母的父母。如果你到达一个没有父节点的节点,那么一切正常,你可以设置孩子的父节点。如果您到达孩子,那么您知道如果您设置该父母,则会创建一个循环。

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多