Eliminare la registrazione tabella in hasMany relazioni in Rails
-
21-09-2019 - |
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 .
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.