Hi,
zum Thema "Flag" ...
Es ist eine Frage der Sichtweise. Du willst ja in einer Spalte die Betriebsarten als komma-separierte Liste speichern (r,w oder r). Damit reduzierst du zwar die Menge der gesamt gespeicherten Records aber du müsstes jeden einzelnen auswerten um zu sehen ob r, w oder beides gesetzt ist.
Solch ein boolsches Flag (für Deny/Allow) kannst du auch implizit haben indem du halt nur die erlaubten Benutzungsmodi speicherst, also nur r wenn schreiben nicht erlaubt sein soll.
Lässt du die Benutzungsmodi atomar, also 1 Record pro Datei, Benutzer(Gruppe), "Recht". Kannst du wunderbar indizieren auf das "Recht", d.h. wenn ein "Lese-Recht" abgefragt wird brauchst du nicht alle Datensätze lesen, sondern nur die mit "Recht" = "Lesen", ebenso bei "Schreiben".
Schreiben beinhaltet warhscehinlich bei dir "Anlegen", "Löschen" und "Ändern".
Das könnte ab einer gewissen Menge Datensätze schon einen Unterschied machen.
zum Thema "Benutzer und Gruppen"
Wenn ein Benutzer in mehreren (u.U. auch verschachtelten) Gruppen enthalten sein kann, solltest du diese Komplexität auflösen indem du eine Liste erstellst, in welcher der Benutzer mit allen seinen Gruppen aufgeführt ist.
Wenn der Benutzer auch einzeln Rechte erhalten kann, dann muss er in der Implementierung auch wie eine Gruppe behandelt werden können. Stell dir deine Zuordnungstabelle aus Benutzer/Gruppe, Rechten und Datei vor. Benutzer/Gruppe ist ein Name (denormalisiert) oder eine Id (normalisiert), aber du kannst für ein Feld in einer Tabelle keinen Fremdschlüssel auf 2 andere Tabellen haben. Also musst du entweder ohne Fremdschlüssel arbeiten, oder Benutzer und Gruppe stellen für die Überprüfung von Rechten genau dieselbe Rollen (sind also vom gleichen Entitätstyp) => sind also in derselben Tabelle abgelegt.
Aber der beste Rat ist: Probieren geht über Studieren. Probier eine oder mehrere Varianten aus, analysiere Vorteile, Nachteile, Aufwand. Evt. wirst du bei der einen oder anderen Variante irgendwo in eine Sackgasse geraten. Dann hast du dennoch etwas gelernt. ;-)
Cheers, Frank