O design de conjuntos aninhados é definitivamente difícil quando você precisa fazer atualizações frequentes na árvore. Você acaba tendo que renumerar grandes partes da árvore.
Uma sugestão para mitigar isso é usar números de ponto flutuante em vez de números inteiros. Se você inserir um novo nó na árvore, é relativamente fácil encontrar alguns números FLOAT entre os números do conjunto aninhado do pai do novo nó. Você pode eventualmente chegar aos limites da precisão de um número de ponto flutuante, mas como sua árvore não é muito profunda, isso não acontecerá por um longo tempo.
Outra técnica sobre a qual escrevi eu chamo de Tabela de Fechamento . Este método de armazenamento de hierarquias torna muito mais fácil inserir/atualizar/excluir nós em uma árvore grande sem precisar atualizar muito de sua árvore. E você ainda pode consultar a árvore inteira ou qualquer subárvore em uma única consulta SQL não recursiva.
Para ler mais sobre a tabela de fechamento, consulte:
- Qual é a maneira mais eficiente/elegante de analisar uma tabela plana em uma árvore?
- Modelos para dados hierárquicos com SQL e PHP
- Movendo subárvores em hierarquias de tabela de fechamento
- Antipadrões SQL:evitando as armadilhas da programação de banco de dados
Re seu comentário:
A Lista de Adjacências é simples, tem um mínimo de redundância e suporta relacionamentos FK, o que os Conjuntos Aninhados não suportam. A lista de adjacências suporta a consulta de uma árvore inteira de profundidade arbitrária se você usar consultas recursivas . Mas o MySQL não suporta consultas recursivas.
Se você precisar consultar apenas relacionamentos pai-filho imediatos (ou seja, um nível de profundidade) ou consultar apenas árvores de profundidade fixa, então a Lista de Adjacências está bem.