Frage

Ich habe eine PHP-Web-Anwendung, die eine MySQL-Datenbank für Objektkennzeichnung verwendet, in dem ich die Tag-Struktur als Antwort auf diese Frage SO .

Ich mag eine Tag-Hierarchie implementieren, wobei jeder Tag einen eindeutigen übergeordneten Tag haben kann. Sucht eines übergeordneter Tag T würde dann alle Nachkommen von T entsprechen (das heißt T, Tags whos Eltern ist T (Kinder von T), Enkel von T, usw.).

Der einfachste Weg, dies zu tun, scheint ein ParentID Feld mit dem Tag Tisch zu sein hinzuzufügen, die die ID eines Tags übergeordneten Tag enthält, oder eine magische Zahl, wenn der Tag keinen Elternteil hat. Die Suche nach Nachkommen jedoch dann wiederholt vollständige Suche der Datenbank erfordert die Tags in jeder ‚Generation‘ zu finden, die Ich mag würde zu vermeiden.

A (vermutlich) schneller, aber weniger normalisierte Art und Weise, dies zu tun wäre, einen Tisch zu haben, alle Kinder jeden Tag enthält, oder sogar alle Nachkommen eines jeden Tag. Dies läuft jedoch das Risiko von inkonsistenten Daten in der Datenbank (beispielsweise einen Tag das Kind von mehr als ein Elternteil).

Gibt es eine gute Möglichkeit, Abfragen zu machen Nachkommen schnell zu finden, während die Daten zu halten wie möglich normalisiert?

War es hilfreich?

Lösung 2

Alis Antwort hat einen Link zu Joe Celko der Bäume und Hierarchien in SQL für Smarties , die meinen Verdacht bestätigt - es ist nicht eine einfache Datenbankstruktur, die das beste aus beiden Welten bietet. Das Beste für meinen Zweck scheint in diesem Buch die „Frequent Insertion Tree“ ausführlich zu sein, die wie die „Nested Sets“ von Alis Verbindung, aber mit nicht-konsekutiver Indizierung. Dies ermöglicht, O (1) Einsetzen ( a la unstrukturierten BASIC Zeilennummerierung), mit gelegentlicher Indexreorganisation wie und wann erforderlich.

Andere Tipps

Ich setzte es zwei Spalten verwenden. Ich vereinfache es hier ein wenig, weil ich den Tag-Namen in einer separaten Feld / Tabelle zu halten hatte, weil ich es für verschiedene Sprachen lokalisiert hatte:

  • Tag
  • Pfad

Sehen sie sich diese Zeilen zum Beispiel:

tag            path
---            ----
database       database/
mysql          database/mysql/
mysql4         database/mysql/mysql4/
mysql4-1       database/mysql/mysql4-1/
oracle         database/oracle/
sqlserver      database/sqlserver/
sqlserver2005  database/sqlserver/sqlserver2005/
sqlserver2005  database/sqlserver/sqlserver2008/

etc.

Mit dem like Operator auf dem Weg Feld können Sie einfach alle benötigten Tag Reihen erhalten:

SELECT * FROM tags WHERE path LIKE 'database/%'

Es gibt einige Implementierungsdetails wie wenn Sie einen Knoten in der Hierarchie verschieben müssen alle Kinder ändern zu etc., aber es ist nicht schwer.

Vergewissern Sie sich auch, dass die Länge des Weges lang genug ist - in meinem Fall habe ich für den Pfad nicht den Tag-Namen verwendet, aber ein anderes Feld, um sicherzustellen, dass ich nicht zu lange bekomme Pfade.

Sie können bauen, was Kimball ruft eine Hierarchie Helper Tabelle.

Sagen Sie Hierarchie sieht wie folgt aus: A -> B | B -> C | C -> D

würden Sie Datensätze in eine Tabelle einfügen, die wie folgt aussieht

ParentID, ChildID, Depth, Highest Flag, Lowest Flag
A, A, 0, Y, N
A, B, 1, N, N
A, C, 2, N, N
A, D, 3, N, Y
B, B, 0, N, N
B, C, 1, N, N
B, D, 2, N, Y
C, C, 0, N, N
C, D, 1, N, Y
D, D, 0. N, Y

Ich glaube, ich habe das richtig .... sowieso. Der Punkt ist, dass Sie noch speichern Sie richtig Hierarchie, die Sie gerade diese Tabelle aus Ihrem richtigen Tisch zu bauen. Diese Tabelle abfragt wie ein Banshee. Sagen Sie wissen wollen, was die ganze erste Ebene unterhalb von B ist.

WHERE parentID = 'B' and Depth = 1

ich eine Art von Array verwenden würde, die Kinder-Tags zu speichern, sollte dies viel schneller als auf sich selbst einen Tisch Beitritt (vor allem, wenn Sie eine große Anzahl von Tags haben). Ich hatte einen Blick, und ich kann nicht sagen, ob mysql einen native Array-Datentyp hat, aber man kann diese emulieren, indem Sie eine Textspalte mit und eine serialisierte Array darin zu speichern. Wenn Sie die Dinge beschleunigen, weiter wollen, sollten Sie in der Lage sein, einen Textsuchindex auf dieser Spalte zu setzen, um herauszufinden, welche Tags in Zusammenhang stehen.

[Bearbeiten] Alis Artikel Nach der Lektüre habe ich einige mehr Jagd und dieser Präsentation fand auf einem Haufen Ansätze für Hierarchien in postgres implementieren. Könnte noch zu Erläuterungszwecken hilfreich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top