2014-08-30 21 views
5

Ich möchte eine rekursive Eltern-Kind-Beziehung in einer MySQL-Datenbank darstellen. Ich möchte eine category - subcategory Beziehung erstellen. Eine Kategorie kann N Unterkategorien haben und jede davon kann N Unterkategorien usw. haben. Ich dachte daran, eine einzige category Tabelle mit einem fremden Schlüssel in sich selbst zu haben. Hier ist, was ich meine:SQL Database Design, rekursive Eltern-Kind-Beziehung?

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `parent_category` int NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`parent_category`) REFERENCES `category` (`id`) 
) 

parent_category null sein kann, wenn eine Kategorie eine Top-Level-Kategorie ist.

Ist das die richtige Art, eine Beziehung wie diese darzustellen? Gibt es noch andere Dinge, die ich in meinem Entwurf berücksichtigen sollte (Leistung, Fragen ...)?

+0

möglich Duplikat [SQL - Wie speichern und Hierarchien navigieren] (http://stackoverflow.com/questions/38801/sql -how-to-store-and-navigate-hierarchies) –

+2

Aufgrund der eingeschränkten SQL-Funktionen von MySQL würde ich das in MySQL nicht so machen. Sie werden es sehr schwer haben, Daten aus dieser Hierarchie aufgrund fehlender rekursiver Abfragen abzurufen. Suchen Sie nach einem "geschachtelten Mengenmodell" für ein anderes Design, das mit MySQL implementiert werden kann –

Antwort

4

Es hängt davon ab, wie Sie Ihre Daten verwenden möchten und ob Sie Abfragen zum Aktualisieren und Einfügen bevorzugen möchten. Ihre Lösung wird als nebenstehendes Listenmodell bezeichnet und ermöglicht es Ihnen, Daten sehr einfach einzufügen oder zu aktualisieren. Abfragen können kompliziert sein, wenn Sie eine unbegrenzte Tiefe von Geschwistern haben, aber wiederum hängt es davon ab, wie Sie diese Datenstruktur verwenden möchten. Wenn Sie nur alle Geschwister eines Knotens anzeigen möchten, ist das in Ordnung. Auf der anderen Seite, wenn Sie den gesamten Baum entwickelt und dies in einer Abfrage tun möchten, sind Sie für einen Kopfschmerz.

Eine andere Lösung wäre, eine verkettete Zeichenfolge zu verwenden, die Ihre Hierarchie darstellt. Zum Beispiel:

  1. Europa 1.1 Frankreich 1.1.1 Paris 1.1.2 Marseille
  2. Amerika 2.1 Vereinigte Staaten von Amerika 2.1.1 Washington

Die DDL wäre etwas, wie folgt:

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `link` varchar(30) NOT NULL DEFAULT '.', 
    PRIMARY KEY (`id`), 
) 

Diese Datenstruktur vereinfacht Ihre Abfragen, aber die Aktualisierungen sind langsamer

Eine andere Lösung ist das geschachtelte Mengenmodell, bei dem Sie die ID des Knotens rechts und links von Ihrem aktuellen Knoten registrieren. Es ist die effizienteste Struktur für Abfragen, macht aber das Einfügen und Aktualisieren schwieriger.

http://en.wikipedia.org/wiki/Nested_set_model

Ich empfehle Ihnen, Joe Celko Buch über Bäume und Hierarchien