Was ist der beste Weg, benutzerdefinierte hierarchische Beziehungen in einer Datenbank zu modellieren?

StackOverflow https://stackoverflow.com/questions/728137

Frage

Im Grunde möchte ich die Benutzer in der Lage sein, ein hierarchisches Modell zu definieren, aber dann muß ich den Benutzer zum Speichern von Daten innerhalb ihres definierten Modells ermöglichen. Macht das Sinn? So werden die Nutzer in der Lage sein, neue „Gerätetypen“ zu schaffen, die in einer hierarchischen Art und Weise zu organisieren und entscheiden, wie Einheiten dieser Art darf organisiert werden. Ein einfaches Beispiel: In meinem hypothetischen Schnittstelle ein Benutzer erstellt drei Einheitentypen, Stamm, Zweig und Blatt. Der Anwender definiert dann die Beziehungen zwischen ihnen. Ein Blatt kann in der Hierarchie an jedem Punkt vorhanden sind, eine Verzweigung muss einen Stamm als Eltern haben. Der Benutzer kann dann Instanzen dieser Gerätetypen (wie Einheiten) erstellt und organisieren können sie die Regeln, nach in ihrem Modell definieren ... ist es eine gute Möglichkeit, dies in der Datenbank zu tun?

War es hilfreich?

Lösung

Dies ist eine extrem breite Frage, aber das kann man in der richtigen Richtung weist. Beachten Sie, dass Sie nur die Beziehungsregeln in der Datenbank zu speichern in der Lage sein. Erzwingen von ihnen werden bis zu Ihrem Client-Code sein. Versuchen Sie, diese für Größe ..

unit:
    unit id,
    name,

unit relationship:
    unit id,
    foreign unit id

Sie können dann Ihr Gerät Beziehungstabelle in der folgenden Art und Weise verwenden ..

unit id bezieht sich auf die Einheit es beschreibt. foreign unit id sollte nullable sein.

Ein unit ohne Beziehung Datensätze kann nur an der Wurzel der Hierarchie existieren. Ein unit mit einem null foreign unit id können andere unit als seine Eltern haben. Andernfalls wird ein unit müssen einen anderen unit als seine Eltern haben, und es ist Art einer von denen in seiner Beziehung Aufzeichnungen definiert sein muss.

Wie für die Fälle selbst zu speichern, das sollte einfach sein ..

instance:
    instance id,
    unit id,
    parent instance_id

Ich bin sicher, dass es andere Felder würden Sie müssen (Namen, zum Beispiel), aber ich nehme an, Sie die Drift zu bekommen.

Andere Tipps

Sie müssen drei Konzepte implementieren:

  • die „Einheitentypen“ und ihre Verbände erlaubt
  • die Hierarchie
  • die tatsächlichen Einheiten

Diese Konzepte können mehr oder weniger unabhängig in dem Modell koexistieren, sondern zusammenarbeiten.

create table unittype
(
    id int;
    name varchar(20);
)

create table unitrelationship
(
    id int;
    parent_id int;
)

Sie können die Hierarchie als sich selbst verweisende Tabelle Modell:

create table hierarchy
(
    id int;
    parent_id int;
    unit_type_id int;
    unit_id int;
)

Sie können dann Ihre Einheit Instanzen in einer oder mehreren Tabellen haben und mit ihnen tun, was Sie beschrieben.

create table unit
{
    id int;
    ....
}

Die gute Nachricht ist, dass Sie nur die erlaubten Elterntypen einschränken, die leicht in einer Benutzeroberfläche durchgesetzt werden können, beispielsweise durch die Eltern aus einer Liste aller vorhandenen Einheiten des Typs erlaubt Kommissionierung.

Ich bin auf einem ähnlichen Problem arbeiten, obwohl ich mehrere Hierarchien (eine Gruppe von Kindern, mehrere hierarchische Ansichten) unterstützen müssen. nützlich: Ich habe Joe Celko die "Bäume und Hierarchien in SQL für Smarties" (1558609202 ISBN) gefunden. Ich bin immer noch auf dem Problem arbeiten, aber es kommt so oft, wenn die Erörterung dieses Themas, dass es scheint angemessen zu erwähnen.

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