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 19-08-2009, 11:57
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 Gruppen- / Subgruppenzuweisung, Denkanstoss

Hallo zusammen,


Zur Zeit brüte ich ein Projekt aus welches in sich viele Hauptgruppen und Subgruppen kennen sollte. Sowohl die einen als auch die anderen sollten an bestimmte (und änderbare!) Nutzerrechte gebunden sein. Mir stellt sich nun die Frage, wie (oder wieviele) Tabellen es dafür geben sollte sodass man damit anständig und resourcenarm arbeiten kann.

Meine Idee (eine eher bescheuerte, geb' ich zu!) bisher ist folgende...

Tabelle "User"
--> beinhaltet Dinge wie Usernamen, Passwort, Hauptgruppe, Subgruppe/n (durch Komma getrennt), und weiteres was speziell zum User selbst gehört

Tabelle "User_Gruppen"
--> id, bennennung

Tabelle "User_Sub_Gruppen"
--> id, benennung, rechte (durch komma getrennt)

Tabelle "Rechte"
--> benennung, titel

Tabelle "User_Rechte"
--> User_Id, recht, sub_gruppen_id

Ggf. dazu und/oder vereinzelt noch View's davon (oder zusammengelegt) anlegen..

Grade das trennen durch Kommas ist nicht wirklich eine normalisierte Datenbank aber etwas anderes fällt mir grade nicht ein. *schlafmangel on*


Wie gesagt, dieses Projekt steht noch in der Planungsphase, man muss also nichts bedenken wie z.B. das umschreiben von Skripten, etc.


Für Ideen und/oder Ansätze bin ich dankbar.


Gruss
Mit Zitat antworten
  #2 (permalink)  
Alt 19-08-2009, 12:15
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,

ich würde eine Gruppentabelle machen, die sich selbst referenziert:

group
------
id
name
parent_fkey => group.id

Dann eine Benutzertabelle völlig ohne Gruppenangaben. Da ein Benutzer offenbar in mehreren Gruppen sein kann und mehrere Benutzer in derselben Gruppe, hast du eine klassische n:m-Beziehung, die man mit einer weiteren Tabelle abbildet:

group_x_user
---------------
id
group_fkey => group.id
user_fkey => user.id

Gruß,

Anja

Edit: das mit den Rechten dann natürlich analog, z. B. Tabelle group_x_right
Mit Zitat antworten
  #3 (permalink)  
Alt 19-08-2009, 12:25
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,


ich merke, ich habe vergessen das es um eine MySQL-Datenbank geht und ich diese nur im MyISAM-Format verwenden kann. Deine Ausführungen sagen mir, dass dort InnoDB gemeint ist - oder lieg ich da falsch? Denn das mit dem Referenzieren kenne ich ansonsten nicht wirklich, war nur der Meinung bzgl. InnoDB mal sowas gelesen zu haben.


Gruss
Mit Zitat antworten
  #4 (permalink)  
Alt 19-08-2009, 12:30
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 kannst Fremdschlüssel auch in MyISAM benutzen, allerdings werden dann keine Constraints erzeugt. Auf Deutsch, es wird nicht überprüft, ob der Fremdschlüsselwert, den du einträgst, in der Elterntabelle als Primärschlüsselwert existiert.

Ich rate unbedingt zu InnoDB.
Mit Zitat antworten
  #5 (permalink)  
Alt 19-08-2009, 12:34
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

Wenn ich könnte würde ich das, aber die steht mir leider nicht zur verfügung. Mit ein Grund warum ich mir solche Gedanken um die Struktur machen muss - es hängt im Endeffekt viel Code davon ab (eben wegen der fehlenden Beziehungen...)
Mit Zitat antworten
  #6 (permalink)  
Alt 19-08-2009, 12:41
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

Die Beziehungen kannst du, wie gesagt, in MyISAM genauso machen. Der Unterschied ist, dass du fehlerhafte Verweise eintragen könntest, die bei InnoDB vorher auf referentielle Integrität geprüft werden und bei Verletzung derselben eine Fehlermeldung zur Folge haben.

Wenn du sauber programmierst und beim Löschen von Datensätzen daran denkst, vorher jeweils auch die abhängigen Kinddatensätze zu löschen und beim Einfügen gültige Schlüsselwerte benutzt, kannst du auch in MyISAM prima mit Beziehungen arbeiten.
Mit Zitat antworten
  #7 (permalink)  
Alt 19-08-2009, 12:52
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Du kannst das auch in myisam erledigen. Bist dann aber selber für die referenzielle Integrität zuständig.


dieses ist auf jeden Fall eine schlechte Idee:
Zitat:
(durch komma getrennt)
Denn es ist ein grober Verstoß gegen die erste Normalform.
Die 5 Normal Formen
__________________
Wir werden alle sterben

Geändert von combie (19-08-2009 um 14:17 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 19-08-2009, 14:13
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Wie stellst du dir das denn vor mit der Rechtezuweisung? Hat eine Gruppe Rechte, hat ein User welche? Hat eine Subgruppe Rechte? Erbt sie welche von der/den Muttergruppe/n, bekommt sie direkt welche zugewiesen? Wie löst du Konflikte zwischen Gruppen-, Subgruppen und Userrechten?
Mit Zitat antworten
  #9 (permalink)  
Alt 19-08-2009, 20:19
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

Das sind eben Dinge die ich irgendwie bedenken will bevor ich das anfange zu strukturieren.

Die Hauptgruppen sind in dem Sinne nur Zwecks Navigation & Seitenbenutzung vorhanden und haben keine fest zugewiesenen Rechte. Jede Hauptgruppe hat einen eigenen Bereich im System welches wiederum so modular gestaltet wird, dass Skripte für jede Hauptgruppe benutzt werden können. Daher auch diese Hauptgruppe, zwecks speichervorgängen (aus welcher solcher kam ein Eintrag, etc...)

Die Rechte ansich erhält der User durch die Subgruppen. Dh. also, dass ein User sowohl in mehreren Hauptgruppen als auch in mehreren Subgruppen sein kann. Es kann also auch sein, dass ein User der in mehreren Subgruppen ist, dasselbe Recht mehrfach hat und genau das wollte ich eigentlich vermeiden. Aber da ich keine InnoDB nutzen kann, werde ich da um aufwändige Konstrukte im Code selbst wohl nicht rumkommen.
Mit Zitat antworten
  #10 (permalink)  
Alt 19-08-2009, 23:20
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Huh, Gruppen sind also Seitenbereiche?! Das scheint ja ein sehr schräges Konzept zu sein. Da du noch in einer sehr frühen Planungsphase steckst, besteht kein Zwang dazu und ich rate dir davon ab. ;-)

Seitenbereiche sind URL-Präfixe wie /content, /profile oder /admin. Ich sehe keinen Grund, dafür Gruppen zu definieren. Die Berechtigungen lassen sich, wie du selbst schon bemerkt hast, allein mit Subgruppen- und direkten Userrechten abbilden.
Also keine Gruppen und Subgruppen, sondern einfach nur Gruppen mit der Funktion, die du für Subgruppen angedacht hast - für Seitenbereiche alias URL-Präfixe was anderes ausdenken.

... und dann nennen wir es Rollen statt Gruppen und schon sind wir beim Standardschema ACL und Router. Das steckt in vielen Systemen (z.B. Drupal) und Frameworks (z.B. Zend Framework). Schau es dir mal an!
Mit Zitat antworten
  #11 (permalink)  
Alt 20-08-2009, 06: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

Guten Morgen,


Habe mir das Drupal mal runtergeladen und mich durch den Inhalt gewühlt. Ich muss zugeben, das ist für mich mind. 2 Stufen zu hoch. Das mein Projekt bzw. die Ideen dazu eine solche komplexität annimmt hätte ich niemals erwartet. Zumal mein Gedankenzug mit den Haupt- / Subgruppen in dem Sinne (jedenfalls von der ersteren her) sehr einfach gedacht war.
Beim LogIn würden alle zum User gehörenden Rechte in der Session abgelegt werden (Server vor zu vielen Querys schonen). So dachte ich mir dann, warum nicht einfach die Id der Hauptgruppe verwenden? zB. seite.php?g=2... würde für die Hauptgruppe mit der Id 2 stehen. Würde ein User die URL manipulieren wollen, so würde der Fehler ja dann aufgrund der fehlenden Session (wenn diese Hauptgruppe nicht zu ihm gehören sollte) ausgegeben werden. Eigentlich eine ganz simple Idee, dachte ich jedenfalls.

Vielleicht muss ich die Planungsideen etwas zurück schrauben und sie mehr meinem Wissen anpassen.
Mit Zitat antworten
  #12 (permalink)  
Alt 20-08-2009, 08:34
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du sollst dir nicht das ganze Drupal ansehen sondern nur das Routing, Rollen und Permissions. Muss auch nicht Drupal sein, das gibt es in vielen anderen Systemen auch. Zugegeben, es ist in einem völlig unbekannten System schwer zu finden, aber ich hatte ja ebenfalls das Zend Framework genannt - Zend Framework: Documentation, Zend Framework: Documentation
Mit Zitat antworten
  #13 (permalink)  
Alt 20-08-2009, 23:10
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

Und weil ich Heute runde 650 km auf der Autobahn verbrachte und dabei viel Zeit zum grübeln hatte, kann ich nun sagen.. "Ist es doch Wahnsinn und doch hat es Methode!"
Mir ging es im groben darum, ein möglichst einfaches Handling der Rechte zu gewährleisten - sowohl im System selbst als auch beim Login und der Navigation.
Lege ich mir nun folgende Tabellen an, so würden alle genannten Bedingungen zutreffen. Nicht schön aber irgendwie doch sehr praktisch ohne InnoDB..

Code:
user: id, name, ....
gruppen: id, name
subgruppen: id, name
rechte: id, name, bezeichnung
user_rechte: user_id, recht, gruppen_id, subgruppen_id
Daraus lässt sich schliessen, das hauptsächlich nur auf die letzte Tabelle zugegriffen wird. Es spielt dann auch keine Rolle mehr wenn ein Recht mehrfach durch versch. Subgruppen an denselben User vergeben ist. Schliesslich landet das sowieso alles in einem Array welches zuerst durch ein array_unique und dann durch ein array_values gejagt wird. Der Vorteil daran ist, dass beim ändern der Rechte einer Subgruppe nicht erst kontrolliert werden muss ob der User dieses (zb. entfernte Recht) nicht auch noch durch eine andere Subgruppe benötigt. So kann man einfach das Recht entziehen, und wenn er es doch haben müsste durch eine andere Subgruppe, so hat er es dann noch immer. So wäre alles in einer Tabelle was man braucht und diese kann ohne weiteres auch erweitert werden wenn es sein muss. So bleibt alles dynamisch/flexibel.. Nachteil.., es ist wahrscheinlich nicht die Normalform... Aber in meinem Dickschädel müsste das so eigentlich ganz gut funktionieren..
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
Denkanstoss (Gruppen in Gruppen) Postaria PHP Developer Forum 8 11-12-2007 10:50
Denkanstoss paulo80 BRAINSTORMING PHP/SQL/HTML/JS/CSS 8 13-12-2006 16:42
benötige Denkanstoss.... SchwarzRot BRAINSTORMING PHP/SQL/HTML/JS/CSS 1 07-02-2005 21:12
[Script] messages in gruppen und in weitere gruppen sortieren? lord_fritte BRAINSTORMING PHP/SQL/HTML/JS/CSS 3 28-12-2004 22:01
Datumsproblem...denkanstoss bernd30-1 PHP Developer Forum 7 29-04-2003 13:10

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 03:56 Uhr.