Sono in procinto di creare uno schema di database per il seguente scenario:
- Ci sono utenti
- Gli utenti hanno ruoli (come "Sviluppatore" o "CEO")
- I ruoli hanno applicazioni (come "Topdesk")
- Le applicazioni hanno autorizzazioni (come "Aggiorna la knowledge base")
- Un ruolo può disporre delle autorizzazioni, se il ruolo ha già accesso all'applicazione
Supponendo che non esistano ambienti ad alte prestazioni (nessuna necessità di ottimizzazione per la velocità), quale sarebbe il modo migliore per implementare questo schema? L'ambiente del database può essere MySQL, MSSQL ... riguarda maggiormente la progettazione del database relazionale.
Io stesso ho ideato quanto segue:
La parte di cui sono più incerto è ovviamente la tabella Applications_Permissions_Roles. È una tabella di collegamento in cima a un'altra tabella di collegamento. Non l'ho mai visto o visto prima. Un altro modo per farlo sarebbe quello di sostituirlo con una tabella di collegamento tra Ruoli e Autorizzazioni, e quindi utilizzare il codice o i vincoli per garantire le relazioni richieste ... ma non mi sembra una buona soluzione. Queste cose dovrebbero essere applicate a livello di database se possibile (e sembra possibile), non a livello di codice.
In secondo luogo, è necessario il collegamento tra Permissions.Application e Applications.Id? Lo uso perché potrebbero non esserci righe in Roles_Applications (come quando hai appena aggiunto una nuova applicazione) e quindi non è possibile capire quali autorizzazioni appartengono a quale applicazione. È anche un unico punto di riferimento per cercare a quale applicazione appartiene un'autorizzazione. Immagino sia giusto, ma crea anche un cerchio nella progettazione del database. Errori MSSQL su di esso quando si tenta di impostare ON_DELETE o ON_UPDATE su cascata.
Qualche suggerimento o è come dovrebbe essere fatto? Qualsiasi altro suggerimento riguardante la convenzione di denominazione e simili sono comunque ben accetti (forse come commento).
Grazie
Luc
Modifica: titolo modificato, si spera rendendolo più chiaro. Il precedente era più completo, ma probabilmente troppo contorto.
Roles_Applications
sia una cosa reale. Dato che tutte le autorizzazioni sono specifiche dell'applicazione, sembra che ci siano Applications_Permissions
(ciò che hai etichettato Permissions
), che possono quindi essere assegnati a ruoli specifici tramite un record in Applications_Permissions_Roles
. Roles_Applications
, infatti, sembra descrivere l'autorizzazione dell'applicazione di base: l'accesso semplice. Oppure, sta affermando che un ruolo ha un certo livello di autorizzazioni per un'applicazione, ma devi cercare altrove per determinare quali.