2010-08-12 8 views
5

Der Titel könnte seltsam formuliert sein, aber es ist wahrscheinlich, weil ich nicht einmal weiß, ob ich die richtige Frage stelle.Welche Art von Datenstruktur sollte ich zum Nachahmen eines Dateisystems verwenden?

Also im Wesentlichen was ich versuche zu bauen ist ein "breadcrumbish" Kategorisierung Typ System (wie ein Dateiverzeichnis), wo jeder Knoten ein Elternteil (außer Root) und jeder Knoten kann entweder Daten oder einen anderen Knoten enthalten. Dies wird für die Organisation von E-Mail-Adressen in einer Datenbank verwendet. Ich habe gerade ein System, in dem Sie eine "Gruppe" erstellen und dieser Gruppe E-Mail-Adressen hinzufügen können, aber es wäre sehr nett, ein Organisationssystem hinzuzufügen.

Dies (in meinem Kopf) ist in einem Baum-Format, aber ich weiß nicht, welcher Baum.

Das Problem, das ich habe, baut es mit MySQL. Bäume, die sich im Speicher befinden, sind leicht zu durchqueren, aber in der Datenbank ist es etwas komplizierter.


Bild von Baum: http://j.imagehost.org/0917/asdf.png


SELECT * FROM Unternehmen: Tims Hardware Store, 7-11, Kwik-E-Mart, Cub Foods, Bob Lebensmittelgeschäft, CONGLOM- O

SELECT * FROM Lebensmittelgeschäfte: Cub Foods, Bob Lebensmittelgeschäft, CONGLOM-O

SELECT * FROM Big Lebensmittelgeschäfte: CONGLOM-O

SELECT * FROM Kirchen: St. Peter-Kirche, St.-Johannes-Kirche


ich denke, das sollte genug sein Informationen, damit ich genau beschreiben kann, was mein Ziel ist.

+0

Sind Sie sicher, dass Sie genau einen Baum wollen? Es sieht so aus, als könnten einige Ihrer Knoten in mehr als einem Zweig vorkommen (so würde ich mir sowieso eine Kategorisierung vorstellen - möglicherweise viele Tags für ein gegebenes Objekt). Wenn Sie beispielsweise eine andere Kategorie unter "Unternehmen" für "Große Unternehmen" haben, könnte CONGLOM-O dort auch nicht angezeigt werden? –

Antwort

3

Nun, es gibt ein paar Muster, die Sie verwenden könnten. Welche davon richtig ist, hängt von Ihren Bedürfnissen ab.

Müssen Sie einen Knoten und alle seine untergeordneten Elemente auswählen? Wenn ja, dann könnte ein Nested set Model (Scroll down to the heading) besser für Sie sein. Die Tabelle würde wie folgt aussehen:

| Name  | Left | Right | 
| Emails | 1 | 12 | 
| Business | 2 | 7  | 
| Tim's | 3 | 4  | 
| 7-11  | 5 | 6  | 
| Churches | 8 | 11 | 
| St. Pete | 9 | 10 | 

Also dann, alles unter einem Knoten zu finden, die nur tun

SELECT name FROM nodes WHERE Left > *yourleftnode* AND Right < *yourrightnode* 

Um alles über dem Knoten zu finden:

SELECT name FROM nodes WHERE Left < *yourleftnode* AND Right > *yourrightnode* 

Wenn Sie nur Möchten Sie für eine bestimmte Ebene abfragen, können Sie eine Adjacency List Model (Scoll down to the heading):

| Id | Name  | Parent_Id | 
| 1 | Email | null  | 
| 2 | Business | 1   | 
| 3 | Tim's | 2   | 
tun

Um alles auf der gleichen Ebene zu finden, gehen Sie einfach:

SELECT name FROM nodes WHERE parent_id = *yourparentnode* 

Natürlich gibt es nichts Sie tun einen hybriden Ansatz zu stoppen, die Sie jedoch lassen Abfrage Sie für die Abfrage zur Hand möchten

| Id | Name  | Parent_Id | Left | Right | Path    | 
| 1 | Email | null  | 1 | 6  |/    | 
| 2 | Business | 1   | 2 | 5  | /Email/   | 
| 3 | Tim's | 2   | 3 | 4  | /Email/Business/ | 

Wirklich, es ist nur eine Frage der Ihre Bedürfnisse ...

+0

Ja! Nested Set Model ist genau das was ich gesucht habe! Danke, duuuuuuuuu! – MALON

0

Wie immer, wenn ich Fragen zum Modellieren von Bäumen und Hierarchien sehe, ist mein Vorschlag, dass Sie eine Kopie von Joe Celko's book on the subject erhalten. Er präsentiert verschiedene Möglichkeiten, sie in einem RDBMS zu modellieren, von denen einige ziemlich einfallsreich sind, und er gibt für jedes Muster die Vor- und Nachteile.

0

Erstellen Sie eine Objektgruppe mit einem Namen, vielen E-Mail-Adressen und einem übergeordneten Objekt, das null sein kann.

1

Der einfachste Weg, um so etwas zu tun, wäre es:

Group 
    - GroupID (PK) 
    - ParentGroupID 
    - GroupName 

People 
    - PersonID (PK) 
    - EmailAddress 
    - FirstName 
    - LastName 

GroupMembership 
    - GroupID (PK) 
    - PersonID (PK) 

, die eine Struktur schaffen sollte, wo man Gruppen haben kann, die Elterngruppen und die Menschen haben, die Mitglieder der Gruppen (oder mehrere Gruppen) sein kann, . Wenn eine Person nur Mitglied einer Gruppe sein kann, dann entfernen Sie die GroupMembership Tabelle und legen Sie einfach eine GroupID auf die People Tabelle.

Komplexe Abfragen gegen diese Struktur können jedoch schwierig werden. Es gibt andere, weniger intuitive Wege, dies zu modellieren, die das Abfragen erleichtern (aber oft die Aktualisierung erschweren).Wenn die Anzahl der Gruppen klein ist, ist es am einfachsten, Abfragen in diesem Fall zu bearbeiten, um den gesamten Gruppenbaum in den Speicher zu laden, zwischenzuspeichern und zum Erstellen der Abfragen zu verwenden.

Verwandte Themen