Hallo zusammen,
vorweg erstmal sorry für die WoT, aber ich hoffe das doch jemand weiter liest...
Ich habe eine kleine Anwendung, welche ursprünglich nur "Benutzer" kannte. Irgendwann kam dann der Umstand hinzu, das Ich zu meinen "Benutzern" auch noch "Gruppen" brauchte um bestimmte Berechtigungskonzepte abzubilden.
Es sieht heute also aktuell so aus, das ich Entitäten habe, welche immer auch eine UserID enthalten.
Dazu gibt es dann aber auch eine Benutzer-Gruppen Beziehungsentität welche wiederum den Gruppen Bezug abbildet.
In den fachlichen Modulen welche nun die jeweiligen Tabellen verwenden, ist implementiert was jemand machen darf, dem der Datensatz gehört, und was jemand machen darf, der nur über die Gruppe das Recht auf diesen Datensatz hat. Zur Vereinfachung des Zugriffes gibt es zu jeder Entität eine View welche die Rohdaten mit der user-Gruppen-Tabelle joint und darüber jeweils immer die User-ID des Zugreifers zurückliefert aber auch die ID des eigentlichen Erzeugers des Satzes.
Das reichte dann aber teilweise auch nicht, so das es dazu kam, das in einer Tabelle z.B. ein "privat" flag eingeführt wurde was nun dieses Standardhandling (jedes Gruppenmitglied darf alles von anderen Gruppenmitgliedern sehen) wieder überschreibt.
Alles in allem eine Situation die mir aktuell so nicht mehr gefällt, und nach einem Refactoring schreit.
Ich habe mir nun folgendes vorgestellt, und würde dies gerne zur Diskussion stellen:
vorweg erstmal sorry für die WoT, aber ich hoffe das doch jemand weiter liest...
Ich habe eine kleine Anwendung, welche ursprünglich nur "Benutzer" kannte. Irgendwann kam dann der Umstand hinzu, das Ich zu meinen "Benutzern" auch noch "Gruppen" brauchte um bestimmte Berechtigungskonzepte abzubilden.
Es sieht heute also aktuell so aus, das ich Entitäten habe, welche immer auch eine UserID enthalten.
Dazu gibt es dann aber auch eine Benutzer-Gruppen Beziehungsentität welche wiederum den Gruppen Bezug abbildet.
In den fachlichen Modulen welche nun die jeweiligen Tabellen verwenden, ist implementiert was jemand machen darf, dem der Datensatz gehört, und was jemand machen darf, der nur über die Gruppe das Recht auf diesen Datensatz hat. Zur Vereinfachung des Zugriffes gibt es zu jeder Entität eine View welche die Rohdaten mit der user-Gruppen-Tabelle joint und darüber jeweils immer die User-ID des Zugreifers zurückliefert aber auch die ID des eigentlichen Erzeugers des Satzes.
Das reichte dann aber teilweise auch nicht, so das es dazu kam, das in einer Tabelle z.B. ein "privat" flag eingeführt wurde was nun dieses Standardhandling (jedes Gruppenmitglied darf alles von anderen Gruppenmitgliedern sehen) wieder überschreibt.
Alles in allem eine Situation die mir aktuell so nicht mehr gefällt, und nach einem Refactoring schreit.
Ich habe mir nun folgendes vorgestellt, und würde dies gerne zur Diskussion stellen:
- Benutzer und Gruppen werden nun in der gleichen Entität gepflegt, und bedienen sich dem gleichen ID-Pool, sind somit datenbankseitig absolut gleichwertig. Über einer Parent-Child-Verknüpfung sind diese miteinander verknüpft
Code:
+--------+--------+-----------+
| id | name | parent_id |
+--------+--------+-----------+
| 0 | Master | NULL |
+--------+--------+-----------+
| 1 | Grp1 | 0 |
+--------+--------+-----------+
| 2 | User1 | 1 |
+--------+--------+-----------+
| 3 | User2 | 1 |
+--------+--------+-----------+
- Jede Entität bekommt nun zwei neue ID-Felder. Eine ID die auf dem tiefsten Level (User) welche aussagt wer der "Erzeuger" dieses Datensatzes ist, und ein Feld welches den "Zugreifer" auf diesen Datensatz angibt.
- Für den "Erzeuger" gilt nach wie vor die Regel:
- nur er darf den von ihn angelegten Datensatz ändern und sehen
- Für den "Zugreifer" gilt:
- auch er darf diesen Datensatz sehen, aber niemals ändern
- Ist der Datensatz, dem "Zugreifer" der ID 1 zugeordnet, und wurde von ID 2 erzeugt, darf jeder aus der "Gruppe" ID 1 diesen Datensatz sehen, aber nur ID 2 darf ihn modifizieren
- Möchte ID 2, das dieser Datensatz "privat" ist, also ihn auch kein anderer sehen darf, wird der Datensatz automatisch beim "Zugreifer" auch auf ID 2 gesetzt. Es gibt also kein "privat" flag mehr.