Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] personas instituciones colaboradores

Estas en el tema de personas instituciones colaboradores en el foro de Mysql en Foros del Web. amigos, Sé que es un tema que surge de cuando en cuando y que desde una perspectiva de OO parece estar bastante claro, pero me ...
  #1 (permalink)  
Antiguo 25/11/2013, 15:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
personas instituciones colaboradores

amigos,

Sé que es un tema que surge de cuando en cuando y que desde una perspectiva de OO parece estar bastante claro, pero me gustaría recibir orientación sobre el modelado de las tablas de una base de datos relacional en la que se guardan por ejemplo colaboraciones en actividades de personas particulares y empresas. Las personas no pertenecen a empresas.

tabla actividades
id_actividad (PK)|actividad

tabla personas
id_persona(PK)|DNI|nombre|apellidos

tabla instituciones
id_institucion(PK)|CIF|nombre

No sé si esta tabla es necesaria para algo.
tabla tipos?
id_tipo|tipo: persona, institución

tabla colaboradores
id_colaborador(PK)|id_tipo(FK relacionado con PK id_tipo de la tabla tipos)

tabla colaboradores_actividades
id_col_actividad|id_colaborador(FK relacionado con PK id_colaborador)

En qué medida los id_persona e id_institucion deberían aparecer como id_colaborador. Mi pregunta es si esto es correcto o si sobra o falta algo. Y, además, qué tipo de consultas facilitaría esta o la estructura que os parezca más apropiada.
  #2 (permalink)  
Antiguo 26/11/2013, 02:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: personas instituciones colaboradores

No entiendo lo que buscas con esta parte

Cita:
No sé si esta tabla es necesaria para algo.
tabla tipos?
id_tipo|tipo: persona, institución

tabla colaboradores
id_colaborador(PK)|id_tipo(FK relacionado con PK id_tipo de la tabla tipos)

tabla colaboradores_actividades
id_col_actividad|id_colaborador(FK relacionado con PK id_colaborador)
De entrada entre personas y instituciones tienes una relación n:m

personas ---->RelPerInst<----Instituciones

En RelPerInst tendras los dos id de las tablas relacionadas.

Por otro lado tienes las Actividades que para mi seria un atributo de RelPerInst como a su vez podría ser otra relación n:m (puesto que una persona puede colaborar para la misma institución en distintas actividades) seria una relación ternaria.

Actividades 1 ------ n ¬
personas 1 ----> n RelPerInst n <---- 1 Instituciones

quedando

RelPerInst
idPersona
idInstitucion
idActividad
--------------- PK (idPersona,idInstitucion,idActividad)
fechaAlta
fechaBaja

Con lo que podrías tener actividades relacionadas con n personas y m instituciones.

De ahí se puede obtener

- las personas que colaboran con una institución.
- las actividades de una persona
- las colaboraciones entre instituciones

La pertenecía o no de las personas a las instituciones debería controlarse a parte. Me queda la duda de si es demasiado fuerte la restricción de que se hayan designado personas para poder "fichar" una colaboración entre instituciones...

No se si es lo que buscas....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 26/11/2013 a las 02:59
  #3 (permalink)  
Antiguo 26/11/2013, 02:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: personas instituciones colaboradores

quimfv, las personas no se relacionan con las actividades, no colaboran para ellas, o son personas o son instituciones las que colaboran en la actividad. Personas e instituciones son entidades distintas y separadas en este caso. Está la actividad, luego la colaboración y finalmente personas e instituciones que colaboran. Pero claro, luego hay que sacar listados de personas que colaboran, de instituciones, y de todos los colaboradores. Busco un buen modo de hacerlo pensando en la base de datos. Creo que es el mismo problema que esas facturas para clientes particulares y empersas.
  #4 (permalink)  
Antiguo 26/11/2013, 03:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: personas instituciones colaboradores

Luego podriamos decir que personas e instituciones estan al mismo nivel con respecto a actividades.

Actividades 1 ----- n > RelActCol < n ---- 1 Colaboradores

Colaboradores seria una unión de Personas e Instituciones lo que se podria solucionar con una vista pero no nos permitiría referenciarla.

Luego

RelActCol
idActividad
idCol <--- Seria el id de una persona o de una institución, no se puede crear una FK
idTipo
---- PK (idActividad,idCol,idTipo)

y mantener la integridad a nivel de código.

Código MySQL:
Ver original
  1. FROM Actividades a INNER JOIN RelActCol r ON a.idActividad=r.idActividad
  2.           INNER JOIN personas p ON r.idCol=p.idPersona
  3. WHERE r.idTipo=1;

(1=persona)

Código MySQL:
Ver original
  1. FROM Actividades a INNER JOIN RelActCol r ON a.idActividad=r.idActividad
  2.           INNER JOIN instituciones i ON r.idCol=i.institucion
  3. WHERE r.idTipo=2;

(2=institucion)

La alternativa es crear una tabla física con la unión de personas e instituciones que si se podria referenciar. Pero ahora tendrás que mantener la integridad por codigo entre las tablas persona e instituciones y la hipotetica tabla Colaboradores.

O dos relaciones n:m Actividades con Personas y Actividades con Instituciones....

__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 26/11/2013 a las 04:11
  #5 (permalink)  
Antiguo 26/11/2013, 08:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: personas instituciones colaboradores

Gracias, Quim,
esto me aclara cosas:
Cita:
RelActCol
idActividad
idCol <--- Seria el id de una persona o de una institución, no se puede crear una FK
idTipo
---- PK (idActividad,idCol,idTipo)
indexando idCol todo mejorará, pero incluye el idTipo para permitir el filtrado más adelante. Esa es la opción que yo pensaba más cómoda y por lo que dices también te lo parece a ti. Pero yo entiendo que el tipo es un atributo del colaborador, aunque no únicamente en la colaboración. Por eso pensaba que una tabla en la que se incluyeran todos los colaboradores, solo su PKcolaborador, luego su tipo, y después su nombre (2 campos en el caso de la persona), y luego otras dos tablas relacionadas para sus atributos más específicos, según se trate de personas o de instituciones. No sé qué sería mejor. Decidme qué opináis desde el punto de vista de las bases de datos relacionales.
  #6 (permalink)  
Antiguo 27/11/2013, 01:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: personas instituciones colaboradores

El problema es mantener, como ya te dije, esa tabla Colaboradores, cada vez que haya un alta en personas o en instituciones también la debes hacer en esa tabla. En cambio sin esa tabla puedes crear las Colaboraciones eligiendo de un select que muestre la unión de personas e instituciones donde el valor de las opciones sea el id_tipo, que luego separas en el momento de guardar los datos.... así aseguras la integridad puesto que no puede haber errores...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 27/11/2013, 06:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: personas instituciones colaboradores

Entendido, gracias, Quim.

Etiquetas: colaboradores, personas, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:57.