Insert/update 在 MySQL 中存储分层数据的有效解决方案?

Insert/update efficient solution to store hierarchical data in MySQL?

我了解在关系数据库中存储分层数据有多种模式,例如使用邻接列表、嵌套集等。

但是,嵌套集之类的缺点是,如果您经常需要按 adding/removing children 更新节点,则更新其余 [=30] 的成本很高=].

如以下示例的场景有什么解决方案:

                 (Parent1)
               /     |      \
         (Child1) (Child2)  (Child3)
         /           |
[Child1a, Child1b][Child2a] 

经常需要更新到:

              (Parent1)
               /     |      \
         (Child1) (Child4)  (Child5)
         /           |         \
   [Child1a, Child1b][Child4a] [Child5a]

等等

我的数据将最多嵌套 3 层,但想法是解决方案应该支持存储在 table 中的许多这种小树,并且 children 可以是 updated/modified以高效的方式。

就存储和更新的复杂性而言,存储分层数据的成本最低的方法是邻接表。

  • 定义 child 的 parent 正好更新 1 行
  • 将 child 移动到新的 parent 正好更新 1 行
  • 删除N个节点的子树就是删除N行
  • 添加N个节点的子树就是插入N行

嵌套集或路径枚举或闭包等其他技术 Table 需要更复杂的更新,但权衡是这些技术支持 arbitrary-depth 操作而无需递归查询语法。

如果你能保证树的深度永远不会超过三层,你就可以通过几个简单的外部连接对邻接表进行许多操作。

请注意 MySQL 8.0 is implementing recursive query syntax,因此将来可能不再需要变通技术。