【发布时间】:2010-11-06 04:35:23
【问题描述】:
我一直在考虑使用modified preorder tree traversal 算法在平面表中存储树(例如 SQL)。
我不喜欢标准方法的一个属性是插入一个节点 必须触摸(平均)N/2 个节点(左或右高于插入点的所有节点)。
我见过的实现依赖于顺序编号的值。这样就没有更新的余地了。
这似乎不利于并发和扩展。想象一下,您有一个植根于世界的树,其中包含大型系统中每个帐户的用户组,它非常大,以至于您必须将树的子集存储在不同的服务器上。触摸所有节点的一半以将节点添加到树的底部是不好的。
这是我正在考虑的想法。基本上通过对键空间进行分区并在每个级别进行划分来为插入留出空间。
这是一个 Nmax = 64 的示例(这通常是数据库的 MAX_INT)
0:64
________|________
/ \
1:31 32:63
/ \ / \
2:14 15-30 33:47 48:62
这里,在树的左半边添加了一个节点。
0:64
________|________
/ \
1:31 32:63
/ | \ / \
2:11 11:20 21:30 33:47 48:62
插入和删除过程必须扩展算法以递归地重新编号到子树的左/右索引。由于查询节点的直接子节点很复杂,我认为将父 ID 也存储在表中是有意义的。然后算法可以选择子树(使用 left > p.left && right
这比仅仅增加所有索引为插入腾出空间(或递减以删除)更复杂,但它有可能影响更少的节点(仅插入/删除节点的父节点的后代)。
我的问题基本上是:
这个想法是否已经正式化或实施了?
这和嵌套区间一样吗?
【问题讨论】:
标签: sql algorithm scalability nested-sets