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:
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
- 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
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:
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.
- 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)
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'