在Joe Celko的嵌套集(修改后的预先遍历遍历)的已知限制中,随着树的大小变大,性能会降低。
Vadim Tropashko提出了嵌套区间,并在本文中提供了示例和理论解释:http://arxiv.org/html/cs.DB/0401014
这是一个可行的解决方案,是否有任何可行的示例(使用任何语言)从原生数据库层抽象出来?
答案 0 :(得分:7)
While I've seen examples for nested sets,我没有看到嵌套间隔的多少,尽管理论上从一个转换到另一个并不困难。不进行预先遍历遍历来标记节点,而是进行广度优先递归。诀窍是找出标记节点的n个子节点的最有效方法。由于a / b和c / d之间的节点是(a + c)/(b + d),因此病态插入(例如,从左到右插入子节点)存在创建相同指数增长的风险在索引值中,例如,使用完整的materialized path。抵消这种影响并不困难 - 一次创建一个新索引,将每个索引插入产生最低结果分母的位置。
就性能下降而言,很大程度上取决于您打算执行的操作。仍然有一些操作需要对整个树进行完全重新标记 - 嵌套集或嵌套间隔方法都适用于很少更改的结构。如果对层次结构进行了大量的结构更改,则“标准”父子表结构可能更容易使用。还要记住,嵌套集的整数标记比间隔方法更容易一些操作(例如后代的数量)。
答案 1 :(得分:1)
我编写了一个gem,它抽象出嵌套区间的所有计算,以便与几个系统上生产中使用的Rails的ActiveRecord https://github.com/clyfe/acts_as_nested_interval/一起使用。