pequeño problema de modelado

XenaiX
24 de Diciembre del 2004
Hola. Mis conocimientos del modelado de las BD son un poco limitados, y se me ha planteado un problema que no veo claro como solucionar.
Tengo que hacer una aplicación que maneje un conjunto de proyectos. Esos proyectos tienen asignadas unas personas, y cada persona puede desarrollar más de un rol dentro del mismo proyecto.
Lo primero que me viene a la cabeza es meter una relación de grado tres, pero entonces tendría una relación por cada rol ¿no? necesitaria un registro para cada terna (proyecto, persona, rol) asi con todos los roles de una misma persona. No se muy bien como se pasa eso a una tabla. ¿Alguien podría darme una solución a esto?

Muchas gracias.

eddie_
24 de Diciembre del 2004
XenaiX:
La solución a tu problema dependerá de las demás restricciones que puedas tener.
Pueden haber personas en proyectos sin roles?
Pueden haber roles en proyectos sin personas asignadas?

Si no pueden darse estos casos entonces no tendrías problemas en implementar una relación de grado tres, lo cual llevado a tablas puede implementarse con 4 tablas: una por cada entidad (proyecto, persona y rol) y otra con la triple relación proyecto-persona-rol (tabla con las 3 foreign keys not null).
Sin embargo yo no lo modelaría con un modelo de triple relación (en general trato de evitarlos) porque te limitan en ciertos aspectos.

Una alternativa: en primer lugar hago una relación N:N entre Persona y Proyecto. Luego hago una asociación entre estas entidades (digamos que te queda una nueva entidad compuesta por ambas y la relación) y finalmente asocio esta a la entidad Roles por medio de una N:N.
Que gano con este modelo? permitirme por ejemplo tener personas en proyectos sin roles definidos (util si quiero definirlos mas tarde)
Para implementar esta solución necesito 5 tablas:
3 tablas (una por cada entidad proy, pers, rol)
1 tabla que represente la relación persona-proyecto
1 tabla con la relacion entre Roles y la tabla persona-proyecto

Espero te haya orientado.

xenaix
24 de Diciembre del 2004
Gracias por la respuesta. Tenía la duda de como pasar a tablas la relación ya que tengo varias cardinalidades dependiendo con quien se relacione cada entidad y pensé que tendría que hacerse varias tablas, una para cada una o algo así. No se si el caso sería igual cuando por ejemplo una persona solo pudiese estar asignada a un proyecto.
Además tampoco se como poner la cardinalidad entre roles y proyectos. Teóricamente sería N:N pero es que como en realidad rol se asocia con proyecto por las personas me parece un concepto extraño.

La segunda alternativa parece interesante, aunque no sabría muy bien como dibujar el modelo. De todas maneras no la necesito, asi que no me complicaré añadiendo otra tabla.

Gracias otra vez. Un saludo.

jairoj
24 de Diciembre del 2004
Xenai, se me ocurre una pregunta.
Los roles en los proyectos son limitados?
No hay la posibilidad de que con el tiempo se creen roles nuevos?

Si es asi, Yo lo haria de la siguiente forma:
Inevitablemente se necesitan las tablas de Personas y proyectos, en la relacion que se crea entre estas dos yo pondria un campo adicinal de tipo Booleano por cada rol, asi puedo saber que roles tiene la persona 'X' en el Proyecto 'Y'.

Persona Proyecto Rol1 Rol2 Rol3
----------- ------------- ------ ------- ------
X Y 1 0 1

La limitación de este modelo es que si se crea un nuevo rol se tiene que alterar esta tabla relación y no simplemente agregar un registro como en el modelo de triple relación.

Espero haber sido de gran ayuda.

XenaiX
24 de Diciembre del 2004
Sí pensé inicialmente en poner rol como atributo de la relación, algo extensible a que tuviese un número fijo de roles, pero cada persona tendrá un número indeterminado de roles, dependiendo de lo ajustado que anden con los proyectos y lo que tenga que apretar el gestor de proyectos a los empleados para que hagan cuarenta cosas a la vez.
Se podría usar este modelo si la eficiencia de las búsquedas fuese crítica, pero realmente cuantas personas pueden acceder a la aplicación, vamos, si fuesen más de 100 sería que mi aplicación la está usando IBM o Microsoft :-D . Aun en esos casos no sería nada crítico, por tanto prefiero abogar por la facilidad de mantenimiento.

Gracias por la idea.