php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-11-2009, 07:36
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Nested Set - Strukturfrage/n

Hallo,


Durch einen Wink mit dem Zaunpfahl (danke an jene Person *g*) wurde ich auf eine - nein, meine! - grauenhaft schlechte Datenbankstruktur bzgl. eines geplanten Projekts aufmerksam gemacht. Selbige Person gab mit das Stichwort Nested Sets. Nachdem ich mir nun einige Artikel und Tutorials dazu durchgelesen habe, glaube ich den den Sinn dahinter verstanden zu haben (jaja.., ich weiss.., glauben ist etwas für Gläubige, Programmierer sollten wissen..). Dennoch stellen sich mir ein paar Fragen die durch keinen der gelesenen Artikel/Tutorials beantwortet/erklärt werden.

Nehmen wir nun also einfach mal an, dass es in diesem Projekt 2 verschiedene (Haupt-)Nutzergruppen und wiederum zu diesen X Untergruppen gibt. Idee ist es nun also, diese alle samt ihrer Benutzerrechte und Navigation in einer Baumstruktur abzubilden.

Frage 1:
Laut den Artikeln soll es mit Nested Sets möglich sein, eine beliebige "tiefe" zu erstellen - also egal wie tief, es sollte immer funktionieren. Würde das also auch für mein oben beschriebenes Vorhaben gültigkeit haben?

Frage 2: Macht es überhaupt Sinn, eine solch tiefe verästung anzulegen - machts das nicht komplizierter?

Diese beiden Fragen erstmal zu folgendem Beispiel, welches ich mir so mal strukturtechnisch notiert habe.

Code:
Systemadministrator 
	|
	|
	-----Hauptgruppe A 
	|	|
	|	-----Navigation Hauptgruppe A
	|		|
	|		----- Link 1
	|			|
	|			----- Benötigtes Recht für Link 1
	|			|
	|			----- Benötigtes Recht für Link 1
	|			|
	|		---------
	|		|
	|		----- Link 2
	|			|
	|			----- Benötigtes Recht für Link 2
	|			|
	|			----- Benötigtes Recht für Link 2
	|			|
	|		---------
	|		|
		usw...
	|	---------
	|	|
	|	----- Untergruppe A aus Hauptgruppe A
	|		|
	|		----- Recht A von Untergruppe A aus Hauptgruppe A
	|		|
	|		----- Recht B von Untergruppe A aus Hauptgruppe A
	|		|
	|	---------
	|	|
	|	----- Untergruppe B aus Hauptgruppe A
	|		|
	|		----- Recht A von Untergruppe B aus Hauptgruppe A
	|		|
	|		----- Recht B von Untergruppe B aus Hauptgruppe A
	|		|
	|	---------
	|	|
		usw...
	---------
	|
	----- Hauptgruppe B
	|	|
	|	-----Navigation Hauptgruppe B
	|		|
	|		----- Link 1
	|			|
	|			----- Benötigtes Recht für Link 1
	|			|
	|			----- Benötigtes Recht für Link 1
	|			|
	|		---------
	|		|
	|		----- Link 2
	|			|
	|			----- Benötigtes Recht für Link 2
	|			|
	|			----- Benötigtes Recht für Link 2
	|			|
	|		---------
	|		|
		usw...
	|	---------
	|	|
	|	----- Untergruppe A aus Hauptgruppe B
	|		|
	|		----- Recht A von Untergruppe A aus Hauptgruppe B
	|		|
	|		----- Recht B von Untergruppe A aus Hauptgruppe B
	|		|
	|	---------
	|	|
	|	----- Untergruppe B aus Hauptgruppe B
	|		|
	|		----- Recht A von Untergruppe B aus Hauptgruppe B
	|		|
	|		----- Recht B von Untergruppe B aus Hauptgruppe B
	|		|
	|	---------
	|	|
		usw...
	---------
	|
---------

Frage 3:
Ist mein Ansatz hierbei denn überhaupt richtig? Wenn nein, worin liege ich falsch und warum?

Hm.., ich glaube für's erste war's das an Fragen dazu. Aber ich bin mir sicher, dass im weiteren Verlauf des Threads noch weitere auftauchen werden. ^^


Gruss
Mit Zitat antworten
  #2 (permalink)  
Alt 17-11-2009, 09:15
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Frage 1: Ein Nested Set kann Datenknoten beliebig tief anlegen, ganz egal welche Daten du dort hinein packst.

Frage 2: Wenn du diese tiefe Verästung benötigst und du keinen Fehler im Konzept hast, macht es natürlich Sinn. Und natürlich wird es Komplizierter. Aber so einen Nested Set willst du eh nicht per Hand in der Datenbank pflegen, dafür ist der Ansatz zu komplex. Mehr als eine Handvoll Knoten bekommt man per Hand kaum noch bewältigt.

Frage 3: Ich würde die Vererbung der Gruppen, die Rechte und die eigentliche Navigationsstruktur auseinanderziehen. So verbaust du dir die tiefere Schachtelung von Gruppen und das Vererben von Rechten.
Mit Zitat antworten
  #3 (permalink)  
Alt 17-11-2009, 20:22
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hallo,


Klingt interessant.

Das heisst also, es würde mehr Sinn machen, wenn ich Navigation, Gruppen und Rechte jeweils einen eigenen Baum 'pflanze' und denen dann jeweils die "root_id" mitgebe, richtig?

Würde dann ja für diesen Zweck 3 Bäume ergeben..

Navigation
--> Gruppen_id
----> Link 1
----> Link 2
usw.

Gruppen
--> Gruppen_id
--> Gruppenname
...

Rechte
--> Recht
----> Gruppen_id

Aber wie kommt man dann zb. dazu, dass ein Administrator alle diese besitzen/sehen kann? Oder liegt meine Aufspaltung schon wieder nicht richtig?
Mit Zitat antworten
  #4 (permalink)  
Alt 17-11-2009, 22:04
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

In deiner Struktur hast du jetzt nur einen Baum, nämlich die Navigation. Weder deine Gruppen noch deine Rechte besitzen bei dir eine Baumstruktur.

Ich dachte mehr an sowas:

Code:
+ Navigation
|-+ Link 1
| |- Unterlink 1
| `- Unterlink 2
`-- Link 2

+ Gruppenbaum
|-+ Gruppe 1
| |- Untergruppe 1
| `- Untergruppe 2
`-- Gruppe 2
Für die Rechte reicht eine einfache Lookup-Liste:
Code:
Rechte:
- ID des Navigations-Knoten
- ID des Gruppen-Knoten
- Recht
Dann kannst du deine ACL sogar noch bei Bedarf mit Vererbung versehen.
Mit Zitat antworten
  #5 (permalink)  
Alt 17-11-2009, 23:46
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo Raffi,

wenn du eine Tabelle als Nested Set konzipierst, sollte sie trotzdem gleichartige Datensätze enthalten (nur Benutzergruppen oder nur Rechte).

Wenn bei dir die Rechte auch hierarchisch sind (macht ja oft Sinn), bietet sich dafür auch ein Nested Set an, aber wieder in einer anderen Tabelle.

Dennoch frage ich mich, ob deine Benutzergruppen wirklich Benutzergruppen sind oder versteckte Rollen. Wenn die Rechte von der Benutzergruppe anhängig sind, ist es eine Rolle. Wenn nur andere oder gar keine Benutzerattribute durch die Gruppenzugehörigkeit bestimmt werden, ist es wirklich nur eine Gruppe.

Kannst du mal deine aktuelle DB-Struktur (ohne Daten) als CREATE-TABLE-Statements posten?

Gruß,

Amica

Geändert von AmicaNoctis (18-11-2009 um 00:54 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 18-11-2009, 07:54
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hallo,


Die DB-Struktur wovon genau? Ein Grossteil ist bisher nur bei meinen Notizen vorhanden und noch nicht in einem System.

Hm.., wohl eher Rollen - aber auch wieder nicht.
Rechte werden (bzw. sollten dann..) durch die zugehörigkeit einer Gruppe gesetzt. Aber ich möchte auch einzelne Rechte an Benutzer vergeben können - also sowohl als auch. Hauptaufgabe der Gruppen wird es aber sein die Rechte zuzuweisen, also mehr eine Rolle als eine Gruppe.


Ziel dieser Nested Sets sollte es ja sein, mit einem Query alles nötige für die schnellste (bzw. performanceärmste) Seitenausgabe (bzw. Seitenaufbau) zu sorgen. Im aktuellen System - das absolut für (verzeiht den Ausdruck) n'Arsch ist - ist die Struktur so undenkbar schlecht, dass bei jeder Aktion mehrere Querys gesendet werden und X Daten verarbeitet werden müssen. Sind dann mal einige Benutzer gleichzeitig online merkt man extrem wie langsam das ganze wird. Grade weil ich "nur" ein Hostingpaket nutze und keinen Server, sollte ich schleunigst an die performance denken und nicht nur an einfachen Code.
Mit Zitat antworten
  #7 (permalink)  
Alt 18-11-2009, 10:59
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

alles benötigte liefert auch ein Join, was der Join aber nicht kann, ist in beliebige Tiefe einer hierarchischen Struktur abzusteigen. Mit einem Join musst du jede Ebene oder Generation einzeln ansprechen, mit einem Nested Set sprichst du Teilbäume an.

Trotzdem hast du mehrere Tabellen, die am Ende gejoint werden und dir damit die vielen Abfragen ersparen. Die Benutzertabelle macht als oder in einem N'Set keinen Sinn (es sei denn du willst noch ein Genealogieportal aufbauen).

Die Kombination aus beiden macht es also.

Amica
Mit Zitat antworten
  #8 (permalink)  
Alt 18-11-2009, 12:27
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Die Benutzertabelle macht als oder in einem N'Set keinen Sinn (es sei denn du willst noch ein Genealogieportal aufbauen).
Stimmt so nicht ganz. Du kannst Gruppen in einem NestedSet implementieren, um Vererbung von Rechten auf Untergruppen zu ermöglichen. Sowas wie:
Code:
+ Angestellte
|-- Angestellter der Abteilung AB
|-- Angestellter der Abteilung XY
+ Projektmitarbeiter
|-- Projekt ABC
`-- Projekt XYZ
Aber das ist natürlich nur wichtig, wenn die Benutzerverwaltung entsprechend feingranular sein soll.
Mit Zitat antworten
  #9 (permalink)  
Alt 18-11-2009, 12:32
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Du hast mich falsch verstanden. Gruppen sind keine Benutzer und gehören in eine Extratabelle, die durchaus als N'Set gestaltet sein kann. Ich sprach aber von Benutzern selbst und die sind nicht hierarchisch (außer wie gesagt bei Familienforschungsprojekten). Daher machen für die Benutzertabelle N'Sets keinen Sinn, bei Benutzergruppen, Rollen, Rechten gegebenenfalls schon.
Mit Zitat antworten
  #10 (permalink)  
Alt 19-11-2009, 17:32
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Du hast mich falsch verstanden. Gruppen sind keine Benutzer und gehören in eine Extratabelle, die durchaus als N'Set gestaltet sein kann. Ich sprach aber von Benutzern selbst und die sind nicht hierarchisch (außer wie gesagt bei Familienforschungsprojekten). Daher machen für die Benutzertabelle N'Sets keinen Sinn, bei Benutzergruppen, Rollen, Rechten gegebenenfalls schon.
Alles klar, dann habe ich dich in der Tat falsch verstanden.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nested Set BlackPerfect SQL / Datenbanken 6 28-10-2008 09:47
Prinzipielle Strukturfrage grosser OOP Applikationen g-sus23 PHP Developer Forum 16 09-03-2006 00:59
Nested Set MTCook SQL / Datenbanken 5 13-07-2005 12:50
Nested Set kari_w PHP Developer Forum 16 16-09-2004 12:12
Polls fürs Forum - Strukturfrage PHPDude SQL / Datenbanken 5 01-03-2003 09:53

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:49 Uhr.