Domanda

Sto pensando a modi per creare un sistema di Role Based Access Control in Rails. Ho visto questi grandi progetti troppo (tra gli altri):

La mia domanda è, è davvero necessario avere un tavolo join per tutto? Se ho una delle tabelle nella relazione ha solo pochi valori (dire meno di 100), non posso semplicemente unire il tavolo join con quel piccolo tavolo) Questo è quello che voglio dire ... Ecco cosa ho bisogno:?

Modelli

  • utente
  • gruppo
  • ruolo
  • Permission
  • UserRoles / RolesUsers
  • GroupRoles
  • Adesioni (GroupUsers)
  • RolePermissions

Una cosa del genere ...

Il modo RoleRequirement funziona è creando una tabella roles e un roles_users unirsi tavolo. Ciò significa che se ho 20 possibili ruoli totale in un'applicazione, ho

  • Tavolo ruolo con 20 righe
  • Tavolo RolesUsers con n righe.

Il che significa che ogni volta che voglio trovare un utente in base al ruolo, devo fare un join. Mi chiedo, però, dal momento che ci saranno solo pochi ruoli in un'applicazione, perché non basta sostituire questa migrazione:

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

con questo ...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

Che potrebbe causare duplicazione (tonnellate di ruoli denominato "admin", per esempio), ma dal momento che lo spazio è a buon mercato, e potremmo creare un metodo come Role.unique per trovare tutti i ruoli unici (per liberarsi di quel tavolo 20-fila), perché la gente creare la tabella aderire?

La stessa cosa con permessi: Ho solo dovrà probabilmente 4 i permessi per iniziare: create read update delete. Quindi non ho bisogno di un tavolo di autorizzazioni e un tavolo roles_permissions, ho potuto solo duplicare i permessi CRUD e hanno la ROLE_ID nella tabella delle autorizzazioni. Stessa cosa con gruppo, non ho bisogno Ruoli gruppo se avessi colonne polimorfici in mia tabella roles.

Qual è il modo consigliato di fare questo?

Ecco un frammento di migrazione proposto .

È stato utile?

Soluzione

Non vorrei suggerire di fare questo. Ciò che si descrive è chiamato denormalizzazione .

Denormalizzazione introduce problemi per molte applicazioni e dovrebbe essere fatto solo se si dispone di una chiara necessità per esso. Io di solito solo denormalizzare tabelle a scopo di reporting.

La tua domanda non dimostrare di avere alcun bisogno di denormalizzare. Piuttosto, mostra un'avversione maldestro di avere tabelle "extra", ed evitando un semplice join. Avere dati duplicati costa più di un semplice spazio, costa anche le prestazioni (unico non è un omaggio). RDBMS moderni sono molto abili a gestire unisce.

Io suggerirei di googling e la ricerca di informazioni su SO denormalizzazione. Non esiste una regola d'oro, ma il vostro caso non sembra avere alcun buon motivo per.

Se siete alla ricerca di miglioramento delle prestazioni, gettare ActiveRecord nella spazzatura. Ci sono molte alternative, e si può scrivere il proprio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top