Je crée un programme dans lequel l'utilisateur construit des répertoires (pas dans Windows, dans mon application) et dans ces dossiers il y a des sous-dossiers et ainsi de suite; Chaque dossier doit contenir des dossiers ou des documents. Quelle est la meilleure structure de données à utiliser? Notez que l'utilisateur peut sélectionner un sous-dossier et rechercher des documents dans celui-ci et dans ses sous-dossiers. Et je ne veux pas limiter les niveaux des dossiers ou des sous-dossiers.Structure de données utilisée pour la structure de répertoire?
Répondre
C'est ce que je fais:
Chaque enregistrement dans la base de données comporte deux champs: ID et ParentID. Les ID sont composés de 4 à 5 caractères (Base36, a-z: 0-9 ou quelque chose de similaire). ID parents sont une concaténation de la structure complète du parent ...
Alors ...
Cette structure:
Root
Folder1
Folder2
Folder3
Folder4
Folder5
Folder6
serait représentée comme ceci:
ID ParentID Name
0000 NULL ROOT
0001 0000 Folder1
0002 0000 Folder2
0003 00000002 Folder3
0004 0000 Folder4
0005 00000004 Folder5
0006 000000040005 Folder6
J'aime cette structure parce que si j'ai besoin de trouver tous les fichiers sous un dossier, je peux faire une requête comme:
SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1
Pour supprimer un dossier et tous ses enfants:
DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'
Pour déplacer un dossier et ses enfants, vous devez mettre à jour tous les enregistrements qui utilisent le même parent, le nouveau parent.
Et je ne veux pas Linit les dossiers ou les niveaux de sous-dossiers
Une limitation évidente est que le nombre de sous-dossiers sont limités à la taille de votre champ ParentID.
Si j'ajoute le champ "taille" pour chaque dossier/document, comment mettre à jour la taille pour tous les parents? – tuananh
je peux penser à quelques façons dont vous pouvez structurer, mais rien battraient l'évidence:
Utilisez le système de fichiers réel.
Modifié vers le bas, mais vraiment, c'est la seule réponse saine! –
Pourquoi? N'ayant pas l'intention de paraître aussi désinvolte, ma question est sincère. – iokevins
que se passe-t-il si quelqu'un veut conserver un instantané dans la mémoire pour que les E/S soient minimales et uniquement pour les écritures? Quoi alors? ... L'utilisation du système de fichiers réel n'est pas une option pour les systèmes haute performance. –
je regarderais en utilisant une sorte de tree data structure
Je sais que la question demande spécifiquement pour une structure de données, mais ...
Si vous utilisez peut-être un langage orienté objet, vous pouvez utiliser la modèle de conception composite qui convient idéalement à ce type de structure arborescente hiérarchique. Vous obtenez ce que vous demandez.
La plupart des langages OO sont livrés avec une sorte d'abstraction pour le système de fichiers, donc là où je commencerai. Puis sous-classe si vous devez.
Je m'attendrais à des répertoires sous la forme d'un tableau d'objets qui sont des répertoires ou des fichiers, par exemple.
vous pouvez utiliser m-way structure de données d'arbre
Cela devrait être un commentaire. –
Je recommande arbre B + .... Vous pouvez facilement utiliser l'indexation (page, dossier, etc.) et tous.
B+ Tree http://commons.wikimedia.org/wiki/File:Btree.png
pour plus d'informations: http://ozark.hendrix.edu/~burch/cs/340/reading/btree/index.html
A en juger par la spécification, un dossier ne peut pas contenir un mélange de dossiers et de documents? Et vous ne pouvez pas avoir de sous-dossiers vides? Merci d'être précis. –
En fait, une partie dit que les dossiers ne peuvent pas contenir un mélange; une autre partie suggère qu'ils pourraient. –