2008-11-01 4 views
8

Ich mache ein Programm, das der Benutzer Verzeichnisse erstellen (nicht in Windows, in meiner App) und in diesen Ordnern gibt es Unterordner und so weiter; Jeder Ordner muss entweder Ordner oder Dokumente enthalten. Was ist die beste zu verwendende Datenstruktur? Beachten Sie, dass der Benutzer einen Unterordner auswählen und nach Dokumenten darin und in seinen Unterordnern suchen kann. Und ich möchte nicht die Ordner oder Unterordner Ebenen begrenzen.Datenstruktur für die Verzeichnisstruktur verwendet?

+0

aus der Beschreibung zu urteilen, ein Ordner kann nicht eine Mischung von Ordnern und Dokumenten enthalten? Und Sie können keine leeren Unterordner haben? Bitte sei präzise. –

+0

Eigentlich sagt ein Teil, Ordner dürfen keine Mischung enthalten; Ein anderer Teil schlägt vor, sie könnten. –

Antwort

11

Das ist, was ich tue:

Jeder Datensatz in der Datenbank hat zwei Felder: ID und ParentID. IDs sind 4-5 Zeichen (Base36, a-z: 0-9 oder etwas ähnliches). Übergeordnetes IDs sind eine Verkettung der gesamten Struktur der Eltern ...

So ...

Diese Struktur:

Root 
    Folder1 
    Folder2 
     Folder3 
    Folder4 
     Folder5 
     Folder6 

würde wie folgt dargestellt werden:

ID  ParentID  Name 

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

Ich mag Diese Struktur, denn wenn ich alle Dateien unter einem Ordner finden muss, kann ich eine Abfrage wie:

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

Um einen Ordner zu löschen und alle seine Kinder:

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

Um einen Ordner und seine Kinder zu bewegen, haben Sie alle Datensätze zu aktualisieren, die die gleichen Eltern verwenden, auf die neue Eltern.

Und ich will nicht die Ordner oder Unterordner Ebenen dieses

Eine offensichtliche Einschränkung Linit ist, dass die Anzahl der Unterordner der Größe Ihres ParentID Bereich begrenzt sind.

+0

Wenn ich das Feld "Größe" für jeden Ordner/Dokumente hinzufügen, wie kann ich die Größe für alle Eltern aktualisieren? – tuananh

8

kann ich von ein paar Möglichkeiten, denken Sie diese Struktur könnte, aber nichts, das Offensichtliche schlagen würde:

Verwenden Sie die aktuelle Dateisystem.

+0

Modded down, aber wirklich, das ist die einzige vernünftige Antwort! –

+0

Warum? Ich möchte nicht so oberflächlich rüberkommen, meine Frage ist aufrichtig. – iokevins

+3

Was ist, wenn jemand einen Snapshot im Speicher behalten möchte, so dass IO minimal und nur für Schreibvorgänge sind. Was dann ? ... Das Verwenden eines tatsächlichen Dateisystems ist keine Option für Hochleistungssysteme. –

5

ich aussehen würde, in eine Art mit tree data structure

+0

Ihr Name erscheint in Ihren Kommentaren. Sie müssen sie nicht unterschreiben. – bzlm

+0

@bzlm: Absolut richtig. Ich habe mich gerade erst an SO gewöhnt :-) – Cameron

0

Ich weiß, dass die Frage, die speziell für eine Datenstruktur zu fragen, aber ...

Wenn Sie eine objektorientierte Sprache verwenden vielleicht können Sie mit der zusammengesetztes Entwurfsmuster, das für diese Art hierarchischer baumartiger Struktur ideal geeignet ist. Sie bekommen, wonach Sie fragen.

0

Die meisten OO-Sprachen haben eine Art Abstraktion für das Dateisystem, also würde ich anfangen. Unterlasse es dann, wenn es nötig ist.

Ich würde Verzeichnisse als ein Array von Objekten, die zum Beispiel Verzeichnisse oder Dateien sind, erwarten.

0

können Sie m-way Baumdatenstruktur

+0

Das sollte ein Kommentar sein. –