El diseño de conjuntos anidados es definitivamente difícil cuando necesita realizar actualizaciones frecuentes en el árbol. Terminas teniendo que volver a numerar grandes partes del árbol.
Una sugerencia para mitigar esto es usar números de coma flotante en lugar de números enteros. Si inserta un nuevo nodo en el árbol, es relativamente fácil encontrar algunos números FLOAT entre los números de conjuntos anidados del padre del nuevo nodo. Eventualmente puede llegar a los límites de precisión de un número de coma flotante, pero dado que su árbol no es muy profundo, eso no sucederá por mucho tiempo.
Otra técnica sobre la que he escrito la llamo Tabla de cierre . Este método de almacenamiento de jerarquías hace que sea mucho más fácil insertar/actualizar/eliminar nodos en un árbol grande sin necesidad de actualizar gran parte de su árbol. Y aún puede consultar todo el árbol o cualquier subárbol en una única consulta SQL no recursiva.
Para obtener más información sobre la tabla de cierre, consulte:
- ¿Cuál es la forma más eficiente/elegante de convertir una mesa plana en un árbol?
- Modelos para datos jerárquicos con SQL y PHP
- Mover subárboles en jerarquías de tablas de cierre
- Antipatrones SQL:Cómo evitar los peligros de la programación de bases de datos
Re tu comentario:
La Lista de adyacencia es simple, tiene un mínimo de redundancia y admite relaciones FK, lo que no admite Conjuntos anidados. La lista de adyacencia admite la consulta de un árbol completo de profundidad arbitraria si usa consultas recursivas . Pero MySQL no admite consultas recursivas.
Si necesita consultar solo relaciones padre-hijo inmediatas (es decir, un nivel de profundidad), o consultar solo árboles de profundidad fija, entonces la lista de adyacencia está bien.