Diseno de aplicacion VS performance Escenario:
Tengo un modulo de acceso especial a contenidos dentro de un sitio.
En este modulo se pueden dar de alta usuarios y grupos, los usuarios son asignados a los grupos, y los grupos a su vez son asignados a los contenidos, estos contenidos pueden ser:
Paginas
FAQ
Eventos
Noticias
Cada uno tiene una o mas tablas para su registro.
Los grupos no pueden ser eliminados si contienen usuarios, por lo tanto, para borrar estos grupos es necesario des-asignar a los usuarios de los grupos, borrando asi su relacion en la tabla de referencia usuarios-grupos.
Ok, hasta ahi todo bien, lo que me esta haciendo un poco de ruido es lo siguiente:
Cada vez que se haga una peticion a cualquiera de estos contenidos, la aplicacion hara una consulta cruzada a la tabla de referencia contenido-grupo, para determinar si el registro de cualquiera de estos contenidos pertenece a la seccion privada del sitio, si encuentra registros en la tabla cruzada, entonces hara una validacion contra cierta(s) variable de sesion para determinar si el usuario tiene acceso.
Problematica:
Lo que se me metio en la cabeza es que a lo mejor no es necesario unir la tabla de referencia cada vez, aumentando con esto el performance de la aplicacion.
Posible Solucion:
La forma en que pense que lo podria lograr es agregar un campo booleano en cada una de las tablas de contenidos, si cuando se agregan/editan estos contenidos existen grupos, el valor sera verdadero, en tanto que si no se agregan grupos, el valor sera falso, determinando con esto un estatus publico/privado.
Implicaciones:
Un grupo puede ser asignado a muchos contenidos
Un contenido puede ser parte de muchos de grupos
En el evento de eliminar un grupo, se eliminara a su vez la relacion de contenido-grupo, pero tendria que crear otro procedimiento para determinar si ese contenido, esta asignado a mas grupos para cambiar el valor de aquel campo booleano, ya que si no esta asignado a mas grupos, entonces el contenido es publico.
Para esto la alternativa seria crear un trigger, ON AFTER DELETE, que compruebe si existen mas registros, si si, entonces no altera el valor del campo, si no, entonces lo altera, convirtiendolo en contenido publico.
A todo esto, a mi forma de ver, es una rutina que podria causar problemas, quizas no sea tan facil controlar esto y no es realmente algo bien disenado, lo que necesito es que me den sus puntos de vista, valdria la pena hacer un diseno un tanto deficiente como el planteado por aumentar el performance, o en todo caso, me dejo de alucinar y hago el JOIN de estas tablas siempre?
Cabe destacar que es un sitio con alto trafico y puede tener una cantidad infinita de contenidos.
Gracias por sus recomendaciones y el tiempo que se tomaron para leer este extenso post.
Salu2,
__________________ "El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway |