Nuestro conocimiento compartido. Nuestro tesoro compartido. Wikipedia.
Proyectos::TreeWeb::R4::Investigación::002 - Modelo de permisos extendido con grupos
Permalink: http://www.treeweb.es/u/869/ 27/11/2010

002 - Modelo de permisos extendido con grupos

Descripcion

Este modelo extiende la funcionalidad de los permisos de usuarios a grupos para facilitar la administración de permisos tanto en el aspecto técnico como en aspecto del usuario.
Los cambios respecto de la versión anterior consiste en agregar una tabla común de grupos 'GRUPOS' y una tabla común que relacione los usuarios que estén en un grupo 'USU_GRU'.
Además, por cada tabla 'abstracta' del sistema se debe agregar una nueva tabla 'PERMISOS_GRU_N'.
Además, se han definido claves únicas para evitar resultados duplicados, (por ejemplo, un usuario puede acceder al mismo registro a través de varios grupos a los que pertenece).
Las claves únicas que se han añadido son las siguientes:
  • USU_GRUPOS - idUsuario + idGrupo
  • PERMISOS_USU_A - idTabla + idUsuario
  • PERMISOS_GRU_A - idTabla + idGrupo

Implementación

El resultado final cuenta con las siguientes tablas comunes:
  • USUARIOS - Almacena los usuarios
  • GRUPOS - Almacena los grupos
  • USU_GRU - Relaciona usuarios y grupos
y las siguientes tablas por cada 'tabla abstracta':
  • TABLA_N - Tabla donde se almacena toda la información real
  • TABLA_USU_N - Tabla donde se almacenan los derechos a nivel de usuario
  • TABLA_GRU_N - Tabla donde se almacenan los derechos a nivel de grupo
El modelo relacional es el siguiente:

Pruebas

Para entender mejor las relaciones entre las tablas he aquí un pequeño ejemplo:
Se ha aumentado de forma notable la cardinalidad de algunas tablas, las pruebas se han hecho con las siguientes magnitudes:
  • USUARIOS - 500
  • GRUPOS - 20
  • USU_GRU - 1.500 (cada usuario pertenece a tres grupos)
  • TABLA_A - 10.000
  • PERMISOS_USU_A - 100.000 registros (cada usuario tiene 10 registros que comparte con una media de 10 usuarios)
  • PERMISOS_GRU_A - 20.000 registros (cada grupo tiene una media de 1000 registros)
Con estas magnitudes, el tiempo que se tarda en generar los datos aleatorios es de 25 segundos con el motor MYISAM.
Lo más asombroso es que con la consulta a nivel de usuarios se tarda 0.0047 segundos en la primera consulta y 0.0003 segundos en las sucesivas.
SELECT * FROM `USUARIOS` LEFT JOIN `PERMISOS_USU_A` ON `USUARIOS`.`id`=`PERMISOS_USU_A`.`idUsuarios` LEFT JOIN `TABLA_A` ON `TABLA_A`.`id`=`PERMISOS_USU_A`.`idTabla` WHERE `USUARIOS`.`login`='JYZHQFOXYZSV@gmail.com'
La sentencia que permite obtener los ids de los registros a los que tengo acceso a través del grupo es:
SELECT DISTINCT `idTabla` FROM `USUARIOS` LEFT JOIN `USU_GRUPOS` ON `USUARIOS`.`id`=`USU_GRUPOS`.`idUsuario` LEFT JOIN `PERMISOS_GRU_A` ON `USU_GRUPOS`.`idGrupo`=`PERMISOS_GRU_A`.`idGrupo` WHERE `USUARIOS`.`login`='b@gmail.com'
La sentencia siguiente permite obtener los ids y los campos de todos los registros a los que tengo acceso a través del grupo:
SELECT DISTINCT `TABLA_A`.* FROM `USUARIOS` LEFT JOIN `USU_GRUPOS` ON `USUARIOS`.`id`=`USU_GRUPOS`.`idUsuario` LEFT JOIN `PERMISOS_GRU_A` ON `USU_GRUPOS`.`idGrupo`=`PERMISOS_GRU_A`.`idGrupo` LEFT JOIN `TABLA_A` ON `PERMISOS_GRU_A`.`idTabla`=`TABLA_A`.`id` WHERE `USUARIOS`.`login`='VOXI@gmail.com'

Documentos relacionados