vovap wrote:Seryi wrote:Основной недостаток Nested Sets, который все приводят это тормозной INSERT и DELETE при большом размере дерева.
Ну это для того, что было описано в статье. Там надо перерисовавать все дерево при любом его изменении. Тот упрощенный, что мы применяли этим в целом не страдает - если нумеровать с дырками - вставка не является проблеммой. В конце концов, конечно можен возникнуть ситуация, когда всталять некуда - тогда надо переорганизовывать все. Для пущей крутизны можно нумеровать каждую ветку отдельно с начала - тогда вообще можно не сильно бояться - хотя построение и усложнится.
Удаление там не проблемма по определению - от того, что исчезнет блок порядковых номеров дерево не изментся.
У меня дерево будет около 10000 элементов. Как было у вас? Сталкивались ли вы с проблемами производительности?
СУБД - SQL Server 2000
Ну, 10000 элементов - это не много. Это в принципе - чепуха, все в памяти может легко поместиться. У нас было, скажем того же порядка. Производительность у нас определялась в целом иными факторами но особых проблемм я не вижу.
1. Yes, for inserts and deletes, you are right. The problem, however, is not solved for updates. Consider the nested sets below:
[10, [20, [30,...,40], [50, ...,60], 70], [80, 200], 1000]
Assuming you want to move subtrees (subsets) from [20,70] to [80, 200]. You'd need to re-number all the highest level nodes plus all the inner subsets thereof, recursively:
[10, [20, 70], [80,[90,...,100], [110,..,120], 200], 1000].
With the adjacency list, you'd need to change only _one_ node. Not only is it more performant (which may not be a serious consideration for 10000 nodes), more importantly the adjacency model is much better for concurrent updates for obvious reasons.
2. The alternative labeling breaks completely if your hierarchical structure is a simple DAG (e.g. at least one node has two parents).
3. If re-numbering is required, then why not go all the way and use the transitive closure that can be incrementally updated. The TC is much more flexible with respect to ad hoc queries and works for DAGs as well as for trees.
Rgds.