Pregunta

Estoy creando un programa que el usuario crea directorios (no en Windows, en mi aplicación) y en estas carpetas hay subcarpetas, etc. Cada carpeta debe contener carpetas o documentos. ¿Cuál es la mejor estructura de datos para usar? Tenga en cuenta que el usuario puede seleccionar una subcarpeta y buscar documentos en ella y en sus subcarpetas. Y no quiero limitar las carpetas ni los niveles de las subcarpetas.

¿Fue útil?

Solución

Esto es lo que hago:

Cada registro en la base de datos tiene dos campos: ID y ParentID. Los ID son 4-5 caracteres (Base36, a-z: 0-9 o algo similar). Los ID de los padres son una concatenación de la estructura completa de los padres ...

Entonces ...

Esta estructura:

Root
   Folder1
   Folder2
      Folder3
   Folder4
      Folder5
         Folder6

Estaría representado de esta manera:

ID     ParentID     Name

0000   NULL           ROOT
0001   0000           Folder1
0002   0000           Folder2
0003   00000002       Folder3
0004   0000           Folder4
0005   00000004       Folder5
0006   000000040005   Folder6

Me gusta esta estructura porque si necesito encontrar todos los archivos en una carpeta, puedo hacer una consulta como:

SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1

Para eliminar una carpeta y todos sus hijos:

DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'

Para mover una carpeta y sus elementos secundarios, debe actualizar todos los registros que utilizan el mismo elemento principal al nuevo elemento principal.

  

Y no quiero alinear las carpetas o los niveles de las subcarpetas

Una limitación obvia para esto es que el número de subcarpetas está limitado al tamaño de su campo ParentID.

Otros consejos

Puedo pensar en algunas formas en que podrías estructurar esto, pero nada superaría lo obvio:

Utilice el sistema de archivos real.

Me gustaría usar algún tipo de estructura de datos del árbol

Debería recomendar B + Tree .... Puedes usar fácilmente la indexación (página, carpeta, etc.) y todo.

B + Tree http://commons.wikimedia.org/wiki/File:Btree .png

para más información: http://ozark.hendrix.edu/~burch/ cs / 340 / reading / btree / index.html

Sé que la pregunta está pidiendo específicamente una estructura de datos pero ...

Si está utilizando un lenguaje orientado a objetos, tal vez pueda usar el patrón de diseño compuesto que es ideal para este tipo de estructura jerárquica de árbol. Obtienes lo que estás pidiendo.

La mayoría de los lenguajes OO vienen con algún tipo de abstracción para el sistema de archivos, así que ahí es donde empezaría. Luego subclase si es necesario.

Espero que los directorios sean una matriz de objetos que son directorios o archivos, por ejemplo.

puede utilizar la estructura de datos del árbol m-way

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top