Descripción
Consiste en montar la infraestructura necesaria para dotar a una tabla de
base de datos de permisos a nivel de registro con 'presunción de
prohibición'.
La presunción de prohibición se refiere a que por defecto un usuario NO tiene derecho, es decir, solo puede acceder a una entidad si en algún lugar está establecido de forma explícita que tiene acceso.
El principal problema del desarrollo se encuentra en el rendimiento del sistema así que 001 se centra en probar si es factible utilizar un sistema de permisos de estas características.
La presunción de prohibición se refiere a que por defecto un usuario NO tiene derecho, es decir, solo puede acceder a una entidad si en algún lugar está establecido de forma explícita que tiene acceso.
El principal problema del desarrollo se encuentra en el rendimiento del sistema así que 001 se centra en probar si es factible utilizar un sistema de permisos de estas características.
Implementación
El sistema cuenta con una tabla de usuarios común a todas las tablas que
implementen los permisos a nivel de registro.
Por cada tabla de datos es necesaria una tabla nueva que relacione cada registro con un conjunto de usuarios que tienen acceso a él Y el tipo de acceso.
El modelo relacional es el siguiente:
Por cada tabla de datos es necesaria una tabla nueva que relacione cada registro con un conjunto de usuarios que tienen acceso a él Y el tipo de acceso.
El modelo relacional es el siguiente:
Pruebas
Para las pruebas se utilizan las siguientes tablas con el motor MYISAM:
- Una tabla USUARIOS con 500 usuarios
- Una tabla TABLA_A con 10.000 registros con una media de 305 bytes por registro
- Una tabla PERMISOS_A_USU con 10.000 registro que almacena los registros visibles de TABLA_A para cada usuario.
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`.`id`
WHERE `USUARIOS`.`login`='gucc@gmail.com'
Sin duda la más rápida con unos tiempos entorno a los 0.0041 segundos en la primera consulta y de 0.00002 segundos en las consultas sucesivas.
SELECT `valor`
FROM `USUARIOS`, `PERMISOS_USU_A`, `TABLA_A`
WHERE `USUARIOS`.`id` = `PERMISOS_USU_A`.`idUsuarios`
AND `PERMISOS_USU_A`.`idTabla` = `TABLA_A`.`id`
AND `USUARIOS`.`login`='CHOQIVLKXOOIHP@gmail.com'
AND `PERMISOS_USU_A`.`TIPO`='2'
Esta consulta también obtuvo unos resultados increíblemente
esperanzadores aunque no tan sorprendentes como la anterior. Sus tiempos
son de alrededor de 0.082 segundos sin conseguir ventajas
en consultas sucesivas por uso de caché.
NOTA: Se hizo una prueba con el motor INNODB con unos resultados muy deficientes en la inserción de registros (567 segundos respecto a los 8 de MYISAM). Sin embargo los procesos de lectura de INNODB son casi tan rápidos como MYISAM.
NOTA: Se hizo una prueba con el motor INNODB con unos resultados muy deficientes en la inserción de registros (567 segundos respecto a los 8 de MYISAM). Sin embargo los procesos de lectura de INNODB son casi tan rápidos como MYISAM.