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

Relaciones varios a varios

Estas en el tema de Relaciones varios a varios en el foro de Bases de Datos General en Foros del Web. A las buenas tardes!!!! Pues como aunque sea sabado a la tarde ,e toca currar os quiero pedir consejo sobre un tema: Quiero implementar una ...
  #1 (permalink)  
Antiguo 24/07/2004, 12:55
 
Fecha de Ingreso: mayo-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
Relaciones varios a varios

A las buenas tardes!!!!

Pues como aunque sea sabado a la tarde ,e toca currar os quiero pedir consejo sobre un tema:

Quiero implementar una BD sobre cine y para ello voy a utilizar varias tablas. Entre estas tablas tengo una disparidad de criterios bastante critica con como relacionar dos de las tablas.

Os explico (suprimo bastantes campos y me quedo con los importantes): en una de las tablas, peliculas, tengo dos campos, idpel (identificativo de la pelicula) y titulo (titulo de la pelicula); en la otra, actores, dos campos tambien, idact (identificativo del actor) y nombre (nombre del actor).

La movida es, como os imaginareis, que una pelicula tiene varios actores y un actor puede participar en varias peliculas. Por lo tanto, la lógica me dice que lo que tengo que hacer es crear una tabla de union con dos campos: idpel e idact.

Sobre todo quiero fijarme en la relación de esta tabla de union con la tabla de actores, ¿no creará redundancia? quedaría así:

idpel idact
001 001
001 005
001 008
002 154
002 054
... ...

¿Os parece buen diseño? ¿Se os curre otra manera de relacionar las tablas?

Asias y saludos a tod@s!!!!!

P.D: ¿alguna peich con información maja sobre las relaciones varios / varios?

Última edición por aneirin; 24/07/2004 a las 12:59
  #2 (permalink)  
Antiguo 24/07/2004, 19:29
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
Mira, está bien, pero hay una cosa para que tengas coherencia. No veo una relación en la tabla "película" donde aparescan los actores, estará perfecto si haces una nueva columna dentro de esta tabla llamada actores, ahí pongas obviamente todos los actores de la película. (Nicolas Cage, Keanu Reaves, etc..)

Luego cuando quieras ver que películas participó un actor, tienes tu tabla de "Actores" para dar referencia. Ahí, si tienes a Nicolas Cage, y quieres buscarlo en la tabla de "Películas", pues haces un LIKE a la columna de Actores donde esté el actor.

Si lo escribes bien, obviamente, aparecerá todas las películas donde está tu actor.

¿Entiendes?
  #3 (permalink)  
Antiguo 25/07/2004, 16:05
Avatar de amanda75  
Fecha de Ingreso: junio-2003
Ubicación: cerca, pero no mucho
Mensajes: 684
Antigüedad: 20 años, 11 meses
Puntos: 0
Yo lo veo bien, si es lo creo.

Creo que lo que has hecho es una tabla "intermedia" que recibe la parte varios de las dos relaciones

(un único id) película / tabla unión (varios id de películas)

(un único id) actores / tabla unión (varios id de actores)


después al hacer el select por medio de los id de la tabla unión se extraen los datos que quieras de ambas tablas .



  #4 (permalink)  
Antiguo 26/07/2004, 05:19
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Desde luego, la mejor manera de solucionarlo es la que propone: una tabla que define la relación entre actores y películas. Esta manera te facilitará todas las búsquedas.
¿Por qué no es mejor el campo como dice lado2mx?. Pues hay tres razones fundamentales
1. Por diseño (la principal), que recomienda tener una tabla que defina la relación
2. Las búsquedas por Like son extremadamente lentas. En este tipo de búsquedas no usas índices, con la penalización de tiempo que eso conlleva.
3. ¿Qué longitud le das al campo que contiene los nombres?, sea cual sea siempre se puede quedar pequeño.

Un saludo.
  #5 (permalink)  
Antiguo 30/07/2004, 13:56
 
Fecha de Ingreso: mayo-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
A las buenas!!!!

Lo primero, muchas gracias a todos por las respuestas. Al final he dejado las tablas tal y como estaban y a la hora de hacer las consultas he hecho una inner join entre la tabla de peliculas y la tabla temporal. Pero ahora me surge una duda con esta consulta. Os explico un poco como tengo planteada las tablas (pongo solamente los campos importantes):

Tres tablas, peliculas, temp_actores y actores.

peliculas act_temp actores
-------- --------- -------
idpel idpel idact
tit idact nombre

y la consulta que he hecho es:

SELECT peliculas.tit, act_temp.idact, actores.nombre
FROM actores INNER JOIN (peliculas INNER JOIN act_temp ON peliculas.idpel = act_temp.idpel) ON actores.idact = act_temp.idact;

Y los resultados aparecen así:

tit / idact / nombre
Pelicula1 / 1 / actor1
Pelicula2 / 2 / actor2
Pelicula3 / 3 / actor3
Pelicula1 / 3 / actor3

Es decir, si una pelicula tiene más de un actor (que, por supuesto, lo tiene) aparece dos veces en la misma fila, ¿como puedo hacer para que aparezcan en la misma fila todos los actores que tenga una pelicula? al estilo de:

tit / idact / nombre / nombre2
Pelicula1 / 1 / actor1 / actor3
Pelicula2 / 2 / actor2 /
Pelicula3 / 3 / actor3 /

¿Alguna sugerencia?

Saludos!!!

Última edición por aneirin; 30/07/2004 a las 14:24
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 10:21.