| | | | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer Registriert seit: 24.12.2004
Beiträge: 1.818
![]() | 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: PHP-Code: cya axo |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 25.04.2005
Beiträge: 1.356
![]() | @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. |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 24.12.2004
Beiträge: 1.818
![]() | Zitat:
| |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 07.11.2004
Beiträge: 161
![]() | @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. |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 24.12.2004
Beiträge: 1.818
![]() | Zitat:
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 [/edit] grüße axo | |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 25.04.2005
Beiträge: 1.356
![]() | Zitat:
__________________ Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält. | |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 07.11.2004
Beiträge: 161
![]() | 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. |
| | |
| | |||
| Erfahrener Benutzer Registriert seit: 24.12.2004
Beiträge: 1.818
![]() | Zitat:
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);
?>
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 Code: SELECT * FROM test WHERE acl & 13 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 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:
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. | ||
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ä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 |
| rechtesystem programmieren, programmieren rechtesystem, bitwise berechtigung, php rechtesystem, rechtesystem php programmieren, acl rechtesystem programmieren, rechtesystem php, benutzergruppen rechte system php, rechtesystem acl php, gruppen und rechtesystem php, php benutzerberechtigung, rechtesystem php mysql, php rechtesystem mit verschiedenen benutzergruppen, rechtesystem mit benutzergruppen php mysql, php berechtigungen system acl, rechtesystem datenbank, acl rechtesysteme, acl rechtesystem, programmieren eines rechtesystems, rechtesystem aufbauen |

Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.