2017-01-05 12 views
0

我理解有几种模式用于在关系数据库中存储分层数据,例如使用邻接表,嵌套套等插入/更新有效的解决方案,以在MySQL中存储分层数据?

然而,像一组嵌套的缺点是,如果你经常需要更新节点通过添加/删除儿童,然后更新表格的其余部分成本很高。

什么是对的场景的解决方案,如下面的例子:

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

在那里将是一个经常需要更新到:

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

我的数据会最多嵌套3层,但想法是解决方案应该支持存储在表格中的许多这样的小树,并且可以以高性能的方式更新/修改儿童。

回答

1

根据存储和更新的复杂性来存储分层数据的最便宜的方法是邻接列表。

  • 定义一个孩子的父母的更新正是1排
  • 移动一个孩子到一个新的父母会更新正好是1排
  • 除去N个节点的子树是N行的缺失
  • 添加的子树N个节点是N行的插入

像嵌套集或路径枚举或闭包表的其他技术需要更复杂的更新,但折衷是这些技术支持任意深度操作不需要递归查询语法。

如果您可以保证该树永远不会超过三个级别,那么可以使用Adjacency List和几个简单的外部联接来执行许多操作。

请注意,MySQL 8.0 is implementing recursive query syntax,所以解决方法技术可能在未来变得不太必要。