Hi!
Tabelle group (Gruppe/Rollen) [...]
Tabelle category (Kategorien) [...]
Tabelle permission [...]
Ist mein Problem jetzt verständlich?
Ja, so wie du das nun beschreibst, ist es das Subjekt-Prädikat-Objekt-Prinzip (Wer-darf-[was]). Als erstes müsstest du vom vorgegebenen Nutzer dessen Gruppenzugehörigkeiten ermitteln. Das ergibt zum Beispiel für ein Eventposter-Mitglied also Eventposter und Alle sowie für den ChefRed Chefredakteur, Redakteur und Alle beziehungsweise die jeweiligen IDs. Dann hast du ja ein Objekt oder auch nicht. Für dieses musst du die Kategorie-Zugehörigkeiten auf gleiche Weise ermitteln. Die Details dazu lass ich mal weg, denn zum Thema rekursives DBMS-Befragen dürftest du genügend Meinungen und Antworten finden.
Nun hast du also eine Liste der Gruppenzugehörigkeiten und eventuell eine für die Kategorien. Jetzt musst du zum gegebenen Prädikat (die auszuführende Tätigkeit) ermitteln, ob deren group_id und category_id in den beiden Listen enthalten ist.
Die Tabellen müssen nicht so aufgebaut sein, wenn eine andere Strukturierung besser wäre, bitte sagen.
Problematisch ist bei einem solchen Aufbau immer die Beziehung über den Parent-Zeiger, denn um alle Vorfahren zu ermitteln, benötigst du in der Regel mehrere Abfragen, was einen ziemlichen Overhead an Query- und Resultverarbeitung mit sich bringt. Aus Nested Sets lassen sich üblicherweise mit einem einzigen Statement die gewünschten Informationen abfragen, bedeuten aber einen erhöhten Aufwand beim Datenändern und beim Tabellenaufbau.
Des Weiteren ist der Wert 0 für eine ID eher ungebräuchlich, weil sie recht einfach mit NULL verwechselt oder NULL nach 0 getypecastet werden kann. Und zumindest für die Objekte/Kategorien benötigst du einen Wert, der ausdrückt, dass selbige keine Rolle spielen (z.B. für Admins und andere Götter). Hierfür könnte NULL (bevorzugt) oder 0 ein geeigneter Kandidat sein.
Lo!