Nuestro conocimiento compartido. Nuestro tesoro compartido. Wikipedia.
Proyectos::TreeWeb::R4::Investigación::001 - Modelo de permisos a nivel de registros por usuario
Permalink: http://www.treeweb.es/u/866/ 27/11/2010

001 - Modelo de permisos a nivel de registros por usuario

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.

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:

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.
Los dos tipos de consulta que obtuvieron mejores resultados han sido las siguientes:
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.