2012-10-27 8 views
10

Rappresenta meglio le autorizzazioni utente nella tabella utente o meglio nella propria tabella delle autorizzazioni?Un modo migliore per rappresentare i ruoli utente nel database

Permesso del tavolo per l'utente
Mettere i permessi nella tabella utente significa fare una colonna per ogni autorizzazione nella tabella user. Un vantaggio è che le query dovrebbero essere eseguite più velocemente perché non sono necessari join quando si collegano gli utenti alle autorizzazioni degli utenti. Uno svantaggio è che con molte autorizzazioni le colonne ingombrano la tabella utente.

Permesso tabella di autorizzazione unito al tavolo d'uso con molti-a-molti
Facendo in questo modo separa nettamente le autorizzazioni dalla tabella utenti, ma richiede un join tra due tabelle per accedere autorizzazioni utente. L'accesso al database potrebbe essere più lento, ma il design del database sembra più pulito.

Forse mantenendo autorizzazioni in una tabella separata è meglio quando ci sono molti permessi. Quali sono le altre considerazioni nel prendere questa decisione e quale design è migliore in varie situazioni?

risposta

20

Il modello standard per il controllo di accesso è chiamato Role Based Security. Come sia il numero di utenti e il numero di diversi tipi di autorizzazioni sono necessarie cresce, la gestione dei vostri user-to-permessi link può diventare sempre più difficile.

Per esempio, se si dispone di cinque amministratori e cinquanta utenti, come si fa a mantenere i permessi di ogni gruppo in sincronia? Quando uno dei tuoi utenti viene promosso a un amministratore, quante modifiche devi apportare? La risposta è di creare due incroci: utenti a ruoli e ruoli da permessi.

Questa soluzione è descritta (compresi diagramma entità-relazioni) nella risposta alla this question.

enter image description here

+2

Questa è una risposta valida per un'applicazione più complessa.Come nota @Nurkeiwicz, una semplice applicazione potrebbe non avere nemmeno bisogno di una tabella dei rulli o di una tabella delle autorizzazioni. – steampowered

+0

bel diagramma, quale strumento hai usato? – dangerousdave

+1

@dangerousdave - Ci scusiamo per la risposta ritardata, sono stato fuori città. Uso Visio con forme intelligenti personalizzate che ho creato per utilizzare la convenzione visiva ERD di James Martin e un motivo di linea personalizzato che conferisce un aspetto disegnato a mano. –

4

Il tuo primo approccio è fattibile quando il numero dei diversi ruoli/permessi è relativamente piccolo. Ad esempio se hai solo due tipi di utenti: normale e admin, una tabella separata sembra un overkill. La colonna singola is_admin è sufficiente e semplice.

Tuttavia, questo approccio non viene ridimensionato una volta che il numero di ruoli supera alcuni. Esso presenta alcuni inconvenienti:

  • tabella utente diventa molto "largo" aventi un sacco di colonne vuote (spazio) sprecare

  • aggiungendo nuovo ruolo al sistema richiede che modifica tabella utente. Questo è ingombrante e potrebbe richiedere molto tempo per la banca dati degli utenti di grandi dimensioni

  • l'elenco dei ruoli utente richiede l'enumerazione su tutte le colonne, al contrario della semplice query del database.

+0

enumerazione colonne autorizzazioni per mostrare tutti i tiri e l'esecuzione dei comandi altare a db - due cose che non ho in mente. La tabella separata diventa rapidamente più desiderabile. – steampowered

Problemi correlati