Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/07/2013, 10:34
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Duda entidad-relacion: ¿ Relacion reflexiva o multiple ?

Hola suxor:

Hay varias alternativas para este escenario, dependiendo de tu lógica de negocio. Veamos algunos hechos...

En primer lugar, si TODAS las actividades deben tener asignadas un RESPONSABLE y ese responsable tiene que ser un socio, entonces basta con que agregues una Llave Foránea a tu tabla de actividades hacia la tabla de socios, es decir, tendrías tu información más o menos asi:

Código SQL:
Ver original
  1. SELECT * FROM socios;
  2. +----------+--------------+
  3. | id_socio | nombre_socio |
  4. +----------+--------------+
  5. |        1 | socio 1      |
  6. |        2 | socio 2      |
  7. |        3 | socio 3      |
  8. +----------+--------------+
  9.  
  10. SELECT * FROM actividades;
  11. +--------------+----------+------------------+
  12. | id_actividad | id_socio | nombre_actividad |
  13. +--------------+----------+------------------+
  14. |            1 |        3 | actividad 1      |
  15. |            2 |        1 | actividad 2      |
  16. |            3 |        2 | actividad 3      |
  17. +--------------+----------+------------------+
  18.  
  19. SELECT a.id_actividad, a.nombre_actividad, s.nombre_socio AS responsable
  20. FROM actividades a
  21. INNER JOIN socios s ON a.id_socio = s.id_socio
  22. ORDER BY a.id_actividad;
  23. +--------------+------------------+-------------+
  24. | id_actividad | nombre_actividad | responsable |
  25. +--------------+------------------+-------------+
  26. |            1 | actividad 1      | socio 3     |
  27. |            2 | actividad 2      | socio 1     |
  28. |            3 | actividad 3      | socio 2     |
  29. +--------------+------------------+-------------+

Ahora bien, si no todas las actividades deben tener asignado un responsable, entonces lo que tienes que hacer es crear una tabla adicional que relaciones las actividades que si tienen responsables, incluyendo las llaves foráneas hacia la actividad y el socio, es decir, algo como esto:

Código SQL:
Ver original
  1. SELECT * FROM socios;
  2. +----------+--------------+
  3. | id_socio | nombre_socio |
  4. +----------+--------------+
  5. |        1 | socio 1      |
  6. |        2 | socio 2      |
  7. |        3 | socio 3      |
  8. +----------+--------------+
  9.  
  10. SELECT * FROM actividades;
  11. +--------------+------------------+
  12. | id_actividad | nombre_actividad |
  13. +--------------+------------------+
  14. |            1 | actividad 1      |
  15. |            2 | actividad 2      |
  16. |            3 | actividad 3      |
  17. +--------------+------------------+
  18.  
  19. SELECT * FROM socios_actividades;
  20. +--------------------+--------------+----------+
  21. | id_actividad_socio | id_actividad | id_socio |
  22. +--------------------+--------------+----------+
  23. |                  1 |            1 |        3 |
  24. |                  2 |            3 |        2 |
  25. +--------------------+--------------+----------+
  26.  
  27. SELECT a.id_actividad, a.nombre_actividad, s.nombre_socio AS responsable
  28. FROM actividades AS a
  29. LEFT JOIN socios_actividades AS sa ON sa.id_actividad = a.id_actividad
  30. LEFT JOIN socios AS s ON sa.id_socio = s.id_socio
  31. ORDER BY a.id_actividad;
  32. +--------------+------------------+-------------+
  33. | id_actividad | nombre_actividad | responsable |
  34. +--------------+------------------+-------------+
  35. |            1 | actividad 1      | socio 3     |
  36. |            2 | actividad 2      | NULL        |
  37. |            3 | actividad 3      | socio 2     |
  38. +--------------+------------------+-------------+

Observa que aquí al actividad 2 no tiene asignada ningún responsable, por esa razón debes utilizar LEFT o RIGTH JOIN...

Dale un vistazo para ver si esto es más o menos lo que querías preguntar.

Saludos
Leo.