php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.01.2006, 08:54   #1 (permalink)
Erfahrener Benutzer
 
Registriert seit: 07.11.2004
Beiträge: 160
seejay
Standard Rechtesystem

Hallo,
ich hoffe so fragen hier sind genauso erlaubt, da es nicht direkt um die programmierung geht, sondern eher um den Aufbau. Ich möchte ein Rechtesystem aufbauen. Und jetzt wollte ich fragen, ob ihr noch eine bessere Idee habt, das DB-System aufzubauen als meine folgende.
Zur beschreibung:
Es gibt erstens User (wohl klar ) die einzelne Rechte bekommen können und sie auch wieder verlieren können
Es gibt Gruppen, die auch bestimmte Rechte verleihen, die aber auch innerhalb der Gruppenmitglieder wieder entzogen werden soll /insbesondere recht bestimmt bereiche zu betreten oder sachen zu benutzen
Jeder User kann mehreren Gruppen angehören
Es sollen neue Gruppen erstellt werden können, die auch neue Rechte mit sich bringen
Es soll Gruppen geben, wie die Moderatorengruppe, deren Mitglieder je nach Admin alle rechte für bestimmte Gruppen bekomme, aber nicht generell für alle. Nur der/die Admins sollen immer für alle Gruppen alle Rechte bekommen, es sei den nach abstache mit den gruppenmoderatoren (bestimmtes recht der Gruppen)

Jetzt zu meiner umsetzung
usertabelle
id, id_rechte(Varchar)

rechtetablle
id, name

gruppentabelle
id, id_users(VARCHAR),id_rechte(VARCHAR)

Wenn jetzt eine neue Gruppe erstellt wird. Werden x neue rechte erzeugt, und diese in die rechtetabelle eingetragen. Alle diese IDs werden zusammen als String (so '1,2,3,4,..') in der gruppentabelle.id_rechte gespeichert. Dann bekomm jeder User in seine id_rechte diesen String auch drangehängt, sovern er sich in der id_users befindet. Zum schluss wird noch nach der Admingruppe gesucht und allen dieser teilnehmer auch das alle diese Rechte erteilt. Am schluss eine Mail an die Admins, dass es eine neue gruppe gibt und eine an die User, dass sie in einer neuen gruppe sind. Dazu ein Adminmenü, dass es erlaubt den Admins einzelnen User alle Rechte der gruppen zu geben.(als wären sie hinzugefügt worden). Wenn eine Gruppe wieder gelöscht wird. werden alle rechte.id 's gelöscht und auch bei allen Usern der Teil des rechtestrings entfernt.

Es ist ja schon etwas kompliziert, gibt es dafür noch ein besseres System oder denkt ihr meine idee lässt sich ohne weitere probleme so übernehmen
seejay ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.01.2006, 14:38   #2 (permalink)
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard Re: Rechtesystem

Zitat:
Zitat von seejay
Alle diese IDs werden zusammen als String (so '1,2,3,4,..') in der gruppentabelle.id_rechte gespeichert.
Ich habe zwar nicht ganz alles verstanden, was du geschrieben hast. Aber diese Art widerspricht jedem normalisierten DB-Design. Ich würde dir etwa das folgende Design empfehlen. Es wäre allerdings möglich, alle Rechte über die Gruppen zu steuern, dann ist die Tabelle Benutzerrechte überflüssig:
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 20.01.2006, 14:56   #3 (permalink)
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo
Standard

es gäbe aber auch eine mathematische lösung für die rechte, die relativ elegant ist und auf zusätzliche tabellen und damit auf teure joins verzichten kann.

dazu definiert man die rechte folgendermaßen:

PHP-Code:
recht0 (2^0)
recht1 (2^1)
recht2(2^2)
recht3 (2^3)
alle rechte = (recht0 recht1 recht2 recht3) = 8+4+2+15 = ( 2^(3+1) ) - 
keine rechte
0
user x hat recht 1 und recht 2 
recht1 recht2 
in binärdarstellung würde das so aussehen:
PHP-Code:
recht0 0001
recht1 
0010
recht2 
0100
recht3
:  1000
alle rechte
1111
keine rechte
0000
recht1 
recht2 0110 
mit einer generischen klasse, die die diversen berechnungen vollführt, wäre das ganze ein klacks

cya
axo
axo ist offline   Mit Zitat antworten
Alt 20.01.2006, 14:58   #4 (permalink)
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

@axo

Das Binärsystem ist zwar klasse ... es hat nur leider einen entscheidenden Nachteil ... es lässt sich nicht indexieren in der DB
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.
HStev ist offline   Mit Zitat antworten
Alt 20.01.2006, 15:01   #5 (permalink)
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo
Standard

Zitat:
Zitat von HStev
@axo

Das Binärsystem ist zwar klasse ... es hat nur leider einen entscheidenden Nachteil ... es lässt sich nicht indexieren in der DB
halte ich für ein gerücht... natürlich lässt sich das indexieren.
axo ist offline   Mit Zitat antworten
Alt 20.01.2006, 15:08   #6 (permalink)
Erfahrener Benutzer
 
Registriert seit: 07.11.2004
Beiträge: 160
seejay
Standard

@lazydog: auch wenn du nicht alles verstanden hast, ist doch eigentlich alles drin. Ich habe nur die tabellen Benutzerrechte,Benutzergruppe und Gruppenrechte aufgelöst und mit dem varchar gemacht. aber stimmt, meine sache ist nicht gerade normalformkonform. Werd ich mal ändern.
@axo: ein weiterer nachteil ist die menge der rechte. wenn man um die 10rechte normal + etwa 4 pro gruppe hat kommt man mit dem system schnell an riesiege menge von speicherbedarf, weil die zahlen exponential zunehmen.
seejay ist offline   Mit Zitat antworten
Alt 20.01.2006, 15:35   #7 (permalink)
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo
Standard

Zitat:
Zitat von seejay
@axo: ein weiterer nachteil ist die menge der rechte. wenn man um die 10rechte normal + etwa 4 pro gruppe hat kommt man mit dem system schnell an riesiege menge von speicherbedarf, weil die zahlen exponential zunehmen.
auch nicht wirklich. ich bin grad dabei, eine klasse zu schreiben, die das ganze problem abbildet - ich brauch's eh für ein eigenes projekt, und will natürlich auch wissen, ob das ganze so funktionieren könnte, wie ich's mir vorstelle.

grundsätzlich kannst du mit einem 32-bit-integer bis zu 31 berechtigungen ablegen, und:
1. es spricht nichts dagegen, die berechtigungen in mehrere aufzuteilen, d.h. einfach zwei integers zu verwenden, und
2. gilt, dass auch in einem float jeweils nur der exponent belegt wird, was zur folge hat, dass man theoretisch auch bei floats keine rundungsfehler zu erwarten hat - die mantisse ist ja immer gleich. ich bin grad am ausprobieren, wo überhaupt rundungsfehler anfangen -

gerade eben bin ich bei 2^127, also 127 berechtigungen, und hab immer noch keine fehler.

[edit]
die grenze für floats ist 2^1023 (hätte mir auch klar sein können ) ... d.h. 1023 benutzerberechtigungen maximal.
[/edit]


grüße
axo
axo ist offline   Mit Zitat antworten
Alt 20.01.2006, 15:38   #8 (permalink)
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von axo
halte ich für ein gerücht... natürlich lässt sich das indexieren.
Dann indiziere mir das mal bitte so das du alle User mit Recht 0001 schnell gruppieren kannst. Performance technich sind einzelne Felder für jedes Recht seperat und alle indiziert besser. Außerdem dient es der Übersichtlichkeit, das Binäre Rechtesystem gleicht schon fast Magic Numbers.
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.
HStev ist offline   Mit Zitat antworten
Alt 20.01.2006, 16:25   #9 (permalink)
Erfahrener Benutzer
 
Registriert seit: 07.11.2004
Beiträge: 160
seejay
Standard

welchen vorteil habe ich wenn ich es nach der normalenform mache. habe mir gerade ein paar gedanken gemacht und gemerkt, dass mein system sogar besser finde. Nicht erst tausend joints wenn ich mal wissen in welchen gruppen der user mit dem namen xx ist.
seejay ist offline   Mit Zitat antworten
Alt 20.01.2006, 17:06   #10 (permalink)
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo
Standard

Zitat:
Zitat von HStev
Dann indiziere mir das mal bitte so das du alle User mit Recht 0001 schnell gruppieren kannst.

Performance technich sind einzelne Felder für jedes Recht seperat und alle indiziert besser.
na ja... das bezweifle ich inzwischen auch, kurz dachte ich, du hast recht ...

beispiel:

Code:
<?php
$sql = '
CREATE TABLE test (
  userid int(11) unsigned NOT NULL auto_increment,
  acl int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (userid)
) TYPE=MyISAM';
mysql_query($sql);

$sql = 'INSERT INTO test (acl) VALUES ';
   for ($i=0;$i<1000000;$i++) { // oder einfach ein-zwei nullen mehr ...
      $sql .= "(" . $i . "),";
  }
$sql .= " (0) "; // unwichtig, ich will nur in der for-schleife das komma nicht überprüfen.
mysql_query($sql);
?>
die for-schleife nach belieben wiederholen, um mehr einträge zu bekommen.
ich hab grad eine tabelle mit ca. 4 millionen einträgen - wer so viele user hat, soll sich bitte mal melden.

die test-tabelle hat bewusst keinen index auf 'acl', nutzt ja (hier hat hstev recht) eh nix.


um jetzt user herauszubekommen, die die berechtigung XY haben, muss man nur die aktuelle berechtigung des users "bitwise AND " mit der berechtigung, die überprüft werden soll verknüpfen. im prinzip geht es ja nur darum: wenn das bit in beiden zahlen gesetzt ist, hat der user die berechtigung, wenn nicht - nicht.

die abfrage für berechtigung 0 ( 2^0 = 1 ) lautet also:

Code:
SELECT * FROM test WHERE acl & 1
... für berechtigung 13 ( also 1101, also user hat recht 3,2 und 0 ) braucht man also nur
Code:
SELECT * FROM test WHERE acl & 13
... hab's auf die schnelle mit phpmyadmin ausgeführt und kein skript geschrieben.

falls das query cache an ist, unbedingt SELECT SQL_NO_CACHE ausführen, sonst werden folge-abfragen immer aus dem cache geholt.

mein ergebnis:

Code:
Showing rows 0 - 29 (3578771 total, Query took 0.0007 sec)
SQL query: 
SELECT SQL_NO_CACHE *
FROM `test`
WHERE acl &13
LIMIT 0 , 30
d.h. ich liege mit dem binären system bei unter 10 msec ... ich bezweifle schwer, dass ein indizierter JOIN bei der datenmenge schneller wird.

dass kein index verwendet werden kann, erklärt EXPLAIN auch, allerdings scheint es schon so zu sein, dass mySQL die werte bereits sortiert (im b*-baum) ablegt (wenn nicht, spalte indizieren, dann ist das garantiert der fall), womit die bitweisen vergleiche genauso schnell sind wie die indizierung. ... welcher unterzweig eines b*-baumes genommen werden muss, ist ja bekanntermaßen mit nur sehr wenig touches möglich.

Zitat:
Außerdem dient es der Übersichtlichkeit, das Binäre Rechtesystem gleicht schon fast Magic Numbers.
das halte ich für ein fadenscheiniges argument ...

erstens kann man sauber konstanten definieren, und zweitens die ganze ACL-kacke in einer zentralen klasse sauberst kapseln, so dass dieses argument auch nicht mehr zählt.

ich bleibe (noch) dabei: die bit-lösung ist mindestens genauso schnell, braucht aber weniger speicher und ist darüberhinaus auch noch schön.
axo ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mysql organisation und Rechtesystem SchmaR PHP Tipps 2008 3 08.05.2008 19:25
Problem bei binärem Rechtesystem SilentSight PHP-Fortgeschrittene 27 28.04.2008 15:07

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datenbank rechtesystem beispiel, datenbank nicht binäres rechtesystem, datenbank rechtesystem homepage

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:27 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.