Pregunta

estoy pensando en maneras de crear una función de sistema de control de acceso basado en Rails. He visto estos grandes proyectos también (entre otros):

Mi pregunta es, ¿es realmente necesario tener una tabla de unión para todo? ? Si una de las tablas de la relación sólo tiene unos pocos valores (digamos menos de 100), no puedo simplemente fusionar la tabla de unión con esa pequeña mesa) Esto es lo que quiero decir ... Esto es lo que necesita:

Modelos

  • User
  • Group
  • Rol
  • Permiso
  • UserRoles / RolesUsers
  • GroupRoles
  • Pertenencia (GroupUsers)
  • RolePermissions

Algo así ...

La forma RoleRequirement funciona es mediante la creación de una mesa y una roles roles_users tabla de unión. Esto significa que si tengo 20 Roles total posible en una aplicación, tengo

  • tabla de papel con 20 filas
  • tabla RolesUsers con n filas.

Lo que significa que cada vez que quiera encontrar un usuario de papel, que tiene que hacer un join. Me pregunto sin embargo, ya que sólo habrá un par de Roles en una aplicación, por qué no basta con sustituir esta migración:

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 éste ...

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

Eso provocaría la duplicación (toneladas de papeles con nombre "admin", por ejemplo), pero ya que el espacio es barato, y que podría crear un método como Role.unique para encontrar todos los papeles únicos (para deshacerse de esa mesa 20-fila), ¿por qué las personas que crean la tabla de unión?

Lo mismo con permisos: Sólo es probable que tenga 4 permisos para empezar: create read update delete. Así que no necesito una tabla de permisos y una mesa roles_permissions, tan sólo pudiera duplicar los permisos CRUD y tienen la ROLE_ID en la tabla de permisos. Lo mismo pasa con el Grupo, no necesito Roles de grupo si tuviera columnas polimórficos en mi mesa roles.

¿Cuál es la forma recomendada de hacer esto?

Aquí está una fragmento de la propuesta de la migración .

¿Fue útil?

Solución

No sugeriría que hacer esto. Lo que usted describe se llama desnormalización .

Desnormalización presenta problemas para muchas aplicaciones y sólo se debe hacer si uno tiene una clara necesidad para ello. Yo normalmente sólo Desnormalizar mesas para los informes.

Su pregunta no demostrar que tiene necesidad de desnormalizar. Más bien, muestra una aversión equivocado para tener tablas "extra", y evitando un simple unirse. Tener costos de datos duplicados más de espacio justo, que también cuesta rendimiento (única no es un regalo de promoción). RDBMS modernos son muy adeptos a la manipulación une.

Yo sugeriría buscando en Google y búsqueda de SO para obtener información sobre la desnormalización. No hay una regla de oro, pero no parece su caso para tener alguna buena razón para hacerlo.

Si usted está buscando mejoras de rendimiento, tirar a la basura ActiveRecord. Hay muchas alternativas, y usted puede escribir su propia cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top