Ich bin dabei, ein Datenbankschema für das folgende Szenario zu erstellen:
- Es gibt Benutzer
- Benutzer haben Rollen (wie "Entwickler" oder "CEO")
- Rollen haben Anwendungen (wie "Topdesk")
- Anwendungen verfügen über Berechtigungen (z. B. "Update Knowledgebase").
- Eine Rolle kann Berechtigungen haben, wenn die Rolle bereits Zugriff auf die Anwendung hat
Unter der Annahme, dass keine Hochleistungsumgebung vorhanden ist (keine Geschwindigkeitsoptimierung erforderlich), wie lässt sich dieses Schema am besten implementieren? Die Datenbankumgebung kann MySQL, MSSQL sein ... es geht mehr um das relationale Datenbankdesign.
Ich selbst habe mir Folgendes ausgedacht:
Der Teil, über den ich am unsichersten bin, ist natürlich die Tabelle Applications_Permissions_Roles. Es ist eine Verknüpfungstabelle über einer anderen Verknüpfungstabelle. Ich habe das noch nie benutzt oder gesehen. Eine andere Möglichkeit wäre, es durch eine Verknüpfungstabelle zwischen Rollen und Berechtigungen zu ersetzen und dann Code oder Einschränkungen zu verwenden, um die erforderlichen Beziehungen sicherzustellen ... aber das scheint mir keine gute Lösung zu sein. Diese Dinge sollten auf Datenbankebene erzwungen werden, wenn dies überhaupt möglich ist (und es scheint möglich zu sein), nicht auf Codeebene.
Zweitens ist die Verknüpfung zwischen Permissions.Application und Applications.Id erforderlich? Ich verwende es, weil es möglicherweise keine Zeilen in Roles_Applications gibt (z. B. wenn Sie gerade eine neue Anwendung hinzugefügt haben) und es dann nicht möglich ist, herauszufinden, welche Berechtigungen zu welcher Anwendung gehören. Es ist auch ein einziger Bezugspunkt für die Suche, zu welcher Anwendung eine Berechtigung gehört. Ich denke, das ist richtig, aber es macht auch einen Kreis im Datenbankdesign. MSSQL-Fehler beim Versuch, ON_DELETE oder ON_UPDATE auf Kaskade zu setzen.
Irgendwelche Vorschläge, oder soll es so gemacht werden? Alle anderen Vorschläge bezüglich der Namenskonvention und dergleichen sind übrigens ebenfalls willkommen (möglicherweise als Kommentar).
Danke,
Luc
Bearbeiten: Titel geändert, hoffentlich klarer. Der vorherige war umfassender, aber wahrscheinlich zu kompliziert.
Roles_Applications
das eine echte Sache ist. Angesichts der Tatsache, dass alle Berechtigungen anwendungsspezifisch sind, scheint esApplications_Permissions
(was Sie gekennzeichnet habenPermissions
) zu geben, die dann über einen Datensatz in bestimmten Rollen zugewiesen werden könnenApplications_Permissions_Roles
.Roles_Applications
Tatsächlich scheint es sich um die grundlegendste Anwendungsberechtigung zu handeln - den einfachen Zugriff. Oder es wird behauptet, dass eine Rolle über bestimmte Berechtigungen für eine Anwendung verfügt, Sie müssen jedoch anderswo nachsehen, um festzustellen, welche.Antworten:
Die Art und Weise, wie Sie es modelliert haben, ist in Ordnung. Ihr Modell stellt sicher, dass die Geschäftsregeln von der Datenbank durchgesetzt werden.
Es gibt ein paar Dinge, die Sie als Alternative tun könnten. Eine wäre, den Ersatzschlüssel zu entfernen
Roles_Applications
. Als Schnittpunkttabelle können Sie die beiden Fremdschlüssel zusammen als zusammengesetzten Primärschlüssel verwenden. Wenn Sie dies getan haben, das würde ausbreitenRole
undApplication
bis zu IhremApplications_Permissions_Roles
Tisch. Dies hätte den Vorteil, dass Sie Ihre Anwendungsberechtigungsdaten (dh weniger Joins) mehr aus einer Hand erhalten, ohne Ihre Normalisierung in irgendeiner Weise zu beeinträchtigen.Ein anderer Weg, den Sie gehen könnten, wäre, etwas zu vereinfachen und eine Standardberechtigung für jede Anwendung zu definieren. Sie können es so nennen, wie Sie möchten, z. B. "Standardzugriff" oder "Basiszugriff" oder "Benutzer" oder was auch immer für Sie sinnvoll ist. Auf diese Weise können Sie Ihr Modell reduzieren und die
Roles_Applications
Tabelle im Wesentlichen fallen lassen undApplications_Permissions_Roles
direkt mit verbindenRoles
. Dies würde die Art der Abfrage ändern, mit der Sie fragen würden, welche Rollen auf welche Anwendungen zugreifen können. Ihre Geschäftsregeln werden jedoch weiterhin vom Schema durchgesetzt.quelle
Roles_Application
scheint hier keine echte Sache zu sein. Was ist das, über was bedeutet , dass eine bestimmte Rolle hat eine Berechtigungsstufe für eine Anwendung, auch wenn Sie überprüfen müssen ,Applications_Permissions_Roles
um festzustellen , was das Niveau ist? Als Beispiel erhält ein CEO Schreibzugriff auf den Anwendungskalender in Ihrem aktuellen Modell:Rollen
Anwendungen
Berechtigungen
Roles_Applications
Applications_Permissions_Roles
Ich denke, diese Reihe von Beziehungen kann ohne die modelliert werden
Roles_Applications
. Wenn wir das entfernen (wie Joel Brown vorschlägt, aber ohne die Änderung der Annahme, dass es "Standardberechtigungen" gibt):Rollen
Anwendungen
Applications_Permissions (nee
Permissions
)Applications_Permissions_Roles
Die alte
Permissions
Tabelle verfügt nicht nur über Berechtigungen wie "Lesen" und "Schreiben", die dann auf Anwendungen wie "Topdesk" und "Kalender" angewendet werden können: Sie enthält anwendungsspezifische Berechtigungen wie "In Topdesk schreiben" und " In Kalender schreiben "und" Systemuhr in Windows ändern ". Um das klarer zu machen, habe ich die Tabelle benannt,Applications_Permissions
aber das ist natürlich kein notwendiger Schritt.Dieser Ansatz hat den Effekt, dass das Modell abgeflacht wird, ebenso wie Joels zweiter Vorschlag, ohne jedoch Anwendungslogik oder das Konzept der Standardberechtigungen hinzuzufügen.
Roles_Applications
brachte der Partei nichts anderes als einen Hinweis darauf, dass eine Rolle einen gewissen Grad an Zugriff auf eine Anwendung hat. Diese Informationen werden mit größerer Kürze durch das Vorhandensein eines DatensatzesApplications_Permissions_Roles
mit dem richtigen Wert von Role_ID übermittelt.quelle