2015-07-26 8 views
11

Es gibt two ways to work with hierarchy data in MySQL:Adjazenzliste Modell vs Nested Set-Modell für MySQL hierarchische Daten?

  1. Adjazenzliste Modell
  2. Nested Sets

Ein großes Problem der Adjazenzliste Modell ist, dass wir eine Abfrage für jeden Knoten ausgeführt werden müssen erhalten der Weg der Hierarchie.

Im Nested Sets dieses Problem nicht existiert, aber für jeden hinzugefügten Knoten ist notwendig, um ein MySQL-Update auf allen anderen geben links und rechts Wert.

Meine hierarchischen Daten sind keine statischen Daten, wie Produktkategorien von E-Commerce. Ständige Registrierung von Benutzern in hierarchischer Reihenfolge.

In meiner Anwendung, während es viele Konstanten Benutzer Registrierung gibt, muss ich auch den hierarchischen Pfad erhalten, bis der erste Knoten in der Hierarchie erreicht.

Analysieren meiner Situation, welche der beiden Alternativen wäre am besten für meine Anwendung?

Antwort

16

Das Nested-Set-Modell wird nowdays nicht häufig in Datenbanken verwendet, da es komplexer ist als das Adiacency-Listenmodell, da es die Verwaltung von zwei "Zeigern" anstelle von einem einzigen erfordert. Tatsächlich wurde das geschachtelte Mengenmodell in Datenbanken eingeführt, als es schwierig war, rekursive Abfragen durchzuführen, die eine Hierarchie durchlaufen haben.

Ab 1999 Standard-SQL gehören die so rekursive Common Table Expressions genannt, oder rekursive CTE, die einfacher macht (und standardisiert!) Abfragen zu machen, die mit innerhalb einer Hierarchie rekursiven Pfad durchqueren jede Anzahl der Ebenen.

Alle wichtigen DBMS-Systeme haben jetzt diese Funktion mit einer bemerkenswerten Ausnahme: MySQL. Aber in MySQL können Sie dieses Problem mit gespeicherten Prozeduren umgehen. Siehe beispielsweise this post on StackOverflow oder this post on dba.stackexchange.

So in der Zusammenfassung, das sind meine Ratschläge sind:

  1. Wenn Sie immer noch die Verwendung DBMS entscheiden können, sollten Sie dringend einige Alternativen: zum Beispiel, wenn Sie mit einer Open-Source-Datenbank halten möchten, verwenden Sie PostgreSQL Verwenden Sie das Adiacency-Listenmodell, und gehen Sie für Ihre Abfragen mit rekursiven CTEs.
  2. Wenn Sie das DBMS nicht ändern können, sollten Sie trotzdem das Adiencency List Model verwenden und gespeicherte Prozeduren verwenden, wie in den Referenzen angegeben.

UPDATE

Diese Situation ändert sich mit MySQL 8, die zur Zeit in Entwicklung ist und die will integrate Recursive CTEs, so dass ab dieser Version die Nested Sets einfacher sein wird, zu verwenden.

+0

Für was es wert ist, MySQL 8, derzeit in Entwicklung, wird Unterstützung für rekursive CTE-Abfragen haben. –

+0

@ BillKarwin, vielen Dank für die Informationen, ich habe die Antwort aktualisiert. – Renzo