AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Baumstruktur mit Rechten

Ein Thema von Mr_G · begonnen am 23. Dez 2008 · letzter Beitrag vom 4. Jan 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Baumstruktur mit Rechten

  Alt 23. Dez 2008, 16:50
Zitat von mkinzler:
...Das wäre die andere Variante der Vererbung
Wie gesagt... ich habe noch nicht ganz verstanden wie dieses Konzept in (m)eine Baumstruktur integriert werden muss. Vielleicht kann mir das jemand nochmal verdeutlichen oder einen Link mit einem kleinen Beispiel geben.
Zitat von mkinzler:
Ich kenne mich mit MySQL nicht so aus (NestedSets). In FireBird würde ich das durch eine rekursive SP oder eine rekursiven CTE erledigen
CTEs gibt es leider nicht. Eine SP wäre eine Möglichkeit... zu den Nested Sets: Es handelt sich eigentlich nur um ein Prinzip zum ablegen von Bäumen in relationalen Datenbanken (siehe hier und hier).
Jan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Baumstruktur mit Rechten

  Alt 23. Dez 2008, 16:57
Eine Rechtvergabe per Rolle bedeutet nur, dass nicht eine Benutzer sondern eine Benutzergruppe das Recht zugeordnet bekommt.
Um das Prinzip um Rechte zu erweitern bedraf es einen Join auf die Rechtetabelle, dann fliegen die Äste ohne Recht raus
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Baumstruktur mit Rechten

  Alt 23. Dez 2008, 17:04
Zitat von Mr_G:
...
Wichtig wäre mir auch noch ein Rat zum Thema Speicherung: In welcher Form lege ich den Baum am besten in der Datenbank ab und wo verarbeite ich das ganze am besten?
klick
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Baumstruktur mit Rechten

  Alt 23. Dez 2008, 20:13
Danke für die weiteren Antworten...
Ich glaube ich leg mal los und bastel mir einen Entwurf. Den können wir ja dann immernoch diskutieren.
@omata: Deine SP ist mir zu monströs: Zwei Temporary Tables und wenn ich mich nicht irre zwei Verfahren die den Nested Sets "eher unterlegen" sind kombiniert... trozdem danke für den Link! *need input*
Jan
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Baumstruktur mit Rechten

  Alt 24. Dez 2008, 00:51
Zitat von Mr_G:
Deine SP ist mir zu monströs: Zwei Temporary Tables und wenn ich mich nicht irre zwei Verfahren die den Nested Sets "eher ... unterlegen" sind kombiniert...
Ja, das hier alergisch auf Temporäre Tabellen reagiert wird kenne ich ja. In Wirklichkeit haben ich damit schon oft gigantische Geschindigkeitsoptimierungen erzeugen können.
Schade, das hier immer der interresante Gedanke, der sich hinter dieser Thematik und Vorgehensweise verbirgt nicht erkannt wird. Das hier zwei Temporäre Tabellen zum Einsatz kommen, liegt leider an der primitiven Art, wie MySQL mit INSERT-Statements argieren kann.
Der von dir angegebene Links stellt leider nur eine minimalistische Sicht der Dinge dar, wenn dir das reicht und du das erziehlen kannst, was du benötigst, ist das ja ausreichend.
Viel Erfolg bei der Umsetzung.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Baumstruktur mit Rechten

  Alt 24. Dez 2008, 01:03
Zitat von omata:
Der von dir angegebene Links stellt leider nur eine minimalistische Sicht der Dinge dar, wenn dir das reicht und du das erziehlen kannst, was du benötigst, ist das ja ausreichend.
Ich lasse mich immer gerne eines besseren belehren. Also immer her mit den Ideen.
Nach den Weihnachtstagen werde ich mal meinen Ansatz posten.
Bis dahin... und Frohe Weihnachten!
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Baumstruktur mit Rechten

  Alt 31. Dez 2008, 17:09
So...
Ich hab mir nochmal ein par Gedanken gemacht aber ich bin immer noch nicht zu einer zufriedenstellenden Lösung gekommen. Ich habe daher mal meine Idee in ein Bild gefasst (siehe Anhang).
Nun zu meinem Ansatz: Die Knoten landen alle in einer Tabelle, wobei zu jedem Knoten der Parent gespeichert wird. Zum Ausgeben kann ich dann einfach alle Knoten aus der DB lesen und nach ihrem Parent sotiert in Arrays packen und ausgeben. Die Zugriffssteuerung (hier geht es um einen seperaten Verwaltungsbereich indem der Zugriff eingeschränkt werden soll) wollte ich mit einer Entity Rechte lösen, die die Ensprechenden Rechte-Attribute besitzt sowie ein Attribut ob das Recht vererbt werden soll. Um diese Rechte nun mit den Knoten zu verbinden dachte ich an eine Relation die zusätlich eine Information enthält von welchem Knoten aus das Recht ggf. geerbt wurde. Die Rechte werden dann über den vorgeschlagenen Zwischenschritt der "Rolle" einem Benutzer zugeordnet.
Das ganze soll das so funktionieren: Jedem Knoten können verschiedene Rechtedatensätze zugewiesen werden, die ggf. kombiniert werden. Füge ich einen Knoten ein, wird vorher beim Parent geprüft welche vererbten Rechte dieser besitzt und die Rechte werden direkt auch mit dem neuen Knoten verknüpft. Wird die Vererbung aufgehoben, werden anhand des Quell-Attributs der Relation einfach die vererbten Verknüpfungen aufgehoben. Einzig das aktivieren der Vererbung bei vorhandenen Unterknoten ist Problematisch. Meine Idee: Entweder das Neted-Set-Modell anwenden, sodass alle Unterknoten mit einer Abfrage ermittelt werden können, oder eine rekursive Stored Procedure.
Nun stellt sich mir natürlich die Frage ob dieser Ansatz überhaupt brauchbar ist? Ich habe so etwas noch nie gemacht und denke mir fehlt da etwas der Durchblick. Ich bin für jeden Rat dankbar!
Miniaturansicht angehängter Grafiken
erd_211.jpg  
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Baumstruktur mit Rechten

  Alt 2. Jan 2009, 10:41
Keiner einen Kommentar? *push*

P.S.: So wie es ausshieht ist eine rekursive SP unter MySQL gar nicht möglich...
Jan
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#19

Re: Baumstruktur mit Rechten

  Alt 2. Jan 2009, 10:53
Moin,

ich verwende momentan ein aehnliches System in meinen Applikationen und habe es so geloest:
Es gibt eine Tabelle, in der das Nested Set definiert ist - das kennst du ja bereits.
Es gibt nun eine weitere Tabelle, welche auf Gruppenbasis (auch Benutzer sind Gruppen) Rechte zuweist. Dabei gilt: wenn nichts da ist, darf der Benutzer gar nichts.

Ich lese nun als erstes mit einem Query alle IDs aus, die der Benutzer sehen darf (natuerlich in Abhaengigkeit seiner kompletten Benutzergruppen, das ist ein etwas haessliches Dingen). Anschliessend speichere ich es folgendermassen im Array:
Code:
while ($row = $db->fetchrow($result)) {
  $allowedNodes[$row['id']] = true;
}
Diese Loesung hat schonmal den Vorteil, dass du nicht mit in_array() pruefen musst sondern mit isset(), was natuerlich schneller funktioniert.

Anschliessend hol ich mir das Nested Set raus:
Code:
$sql = 'SELECT * FROM nested_set ORDER BY left_id ASC';
$result = $db->query($sql);
Hier verwende ich nicht eine Beschraenkung auf die ID, denn ein Benutzer soll ein Child nicht sehen, wenn er den Parent nicht sehen kann - egal wie die Zugriffsrechte aufs Child sind.

In einer Schleife pruefe ich dann die ganze Sache:
Code:
$treeNodes = array();
while ($row = $db->fetchrow($result) {
  if (isset($rightID)) {
    if ($row['right_id'] < $rightID) {
      continue;
    }
    else {
      unset($rightID);
    }
  }
 
  if (!isset($alloowedNodes[$row['id']])) {
    $rightID = $row['right_id'];
    continue;
  }

  // Restliche Verarbeitung
  $treeNodes[] = $row;
}
Wenn ich nun auf einen Node stosse, welchen der Benutzer nicht sehen darf, speichere ich mir die Right-ID und ueberspringe saemtliche Nodes, deren Right-ID kleiner ist als die gespeicherte (die also unter diesem "unsichtbaren" Node liegen). Sobald ich auf den folgenden Node treffe, loesche ich die gespeicherte Right-ID wieder und arbeite normal weiter.

Mein Tipp: lass die Finger von rekursiven Dingen bei solchen Strukturen. Sobald der Baum groesser wird wirds richtig haesslich, und selbst bei kleinen Baeumen bombardierst du den Server mit Queries, fuer die er bei MyISAM erstmal die ganze Tabelle sperrt. Da kanns dann ganz schoen heiss hergehn

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Baumstruktur mit Rechten

  Alt 3. Jan 2009, 18:56
Vielen Dank für die ausführliche Antwort!
Deine elegante Lösung hat mich überzeugt: Ich werde Nested Sets verwenden...
Nun würde ich meine Rechte noch gerne vererben. Es gäbe ja die Möglichkeit den "Rechte-Datensatz" nur einemal mit einem Knoten zu verknüpfen und dann bei der Verarbeitung des Baumes sich die Rechte zu "merken" und auf die Unterknoten anzuwenden, oder das vererbte Recht direkt mit allen Unterknoten zu verknüpfen, wie ich es bis dato in etwa angedacht hatte (siehe #17).
Ich sehe die Vor- und Nachteile beim Zugriff: Werden oft einzelne Knoten nachgfragt sollte die direkte Verknüpfung besser sein (man muss nicht den ganzen Baum verarbeiten) - werden aber oft neune Knoten eingefügt und wird die Struktur oft verändert (ergo viele seperate Verknüpfungen müssten verändert werden) sollte das anwenden der Rechte bei der Verarbeitung besser geeignet sein, oder?
Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz