I'm in the process of creating a database scheme for the following scenario:
- There are users
- Users have roles (such as "Developer" or "CEO")
- Roles have applications (such as "Topdesk")
- Applications have permissions (such as "Update Knowledgebase")
- A role can have permissions, if the role already has access to the application
Assuming no high-performance environment (no need to optimize for speed), what would be the best way to implement this schema? The database environment can be MySQL, MSSQL... it's more about the relational database design.
I myself have come up with the following:
The part I'm most uncertain about is of course the Applications_Permissions_Roles table. It is a linking table on top of another linking table. I've never used or seen this before. Another way to do it would be to replace it with a linking table between Roles and Permissions, and then use code or constrains to ensure the required relations... but that doesn't seem like a good solution to me. These things should be enforced on database-level if at all possible (and it seems possible), not on code-level.
Secondly, is the link between Permissions.Application and Applications.Id required? I use it because there may not be any rows in Roles_Applications (such as when you've just added a new application) and then it's not possible to work out which permissions belong to which application. It also is a single point of reference to lookup to which application a permission belongs. I guess this is right, but it also makes a circle in the database design. MSSQL errors on it when trying to set ON_DELETE or ON_UPDATE to cascade.
Any suggestions, or is this how it's supposed to be done? Any other suggestions regarding naming convention and such are also welcome by the way (perhaps as comment).
Thanks,
Luc
Edit: Changed title, hopefully making it clearer. The previous one was more comprehensive, but probably too convoluted.
Roles_Applications
is a real thing. Given that all permissions are application-specific, it seems there areApplications_Permissions
(what you have labeledPermissions
), which may then be assigned to specific roles via a record inApplications_Permissions_Roles
.Roles_Applications
, in fact, seems to be describing the most basic application permission--simple access. Or, it is asserting that a role has some level of permissions for an application, but you have to look elsewhere to determine which ones.