Foros del Web » Programando para Internet » PHP »

Duda con varias relaciones (FK) a una misma tabla

Estas en el tema de Duda con varias relaciones (FK) a una misma tabla en el foro de PHP en Foros del Web. Buenas a todos. Tengo una duda que espero que me puedan resolver. El caso es que tengo una base de datos ya hecha y me ...
  #1 (permalink)  
Antiguo 03/07/2012, 04:52
 
Fecha de Ingreso: enero-2010
Mensajes: 30
Antigüedad: 14 años, 3 meses
Puntos: 0
Duda con varias relaciones (FK) a una misma tabla

Buenas a todos.

Tengo una duda que espero que me puedan resolver.

El caso es que tengo una base de datos ya hecha y me funciona, pero no esta muy depurada ya que uso muchas tablas y me gustaria acortar las consultas sql.

La duda que me lleva rondando y no se solucionarla es con los desarrolladores y distribuidores de los juegos.

Me explico. En un principio creé la tabla compania (idCompania, logo, nombre, fechaSalida y descripcion). Siendo mi intencion insertar todas las companias ahi y que la tabla juegos se relacione con esta.

Pero resulta que los juegos poseen un desarrollador y un distribuidor (que a fin de cuentas son companias), lo primero que pense fue crear dos claves foraneas a la tabla compania (idcompania) para relacionarlas, esto no me daba problema de sintaxis, pero claro me sacaba aquellos campos en los que el desarrollador y el distribuidor eran los mismos, por lo que estaba mal.

Luego intente crear dos claves primarias en la tabla compania (idDistribuidor y idDesarrollador) pero al crear las dos fk me daba error, concretamente este.

Código PHP:
ERROR 1005Can't create table 'pruebas.#sql-bc_1' (errno: 150)

SQL Statement:

ALTER TABLE `pruebas`.`juegos

  
ADD CONSTRAINT `desarrollador_compania`

  
FOREIGN KEY (`desarrollador` )

  
REFERENCES `pruebas`.`compania` (`idDesarr` )

  
ON DELETE NO ACTION

  ON UPDATE NO ACTION



ERROR
Error when running failback scriptDetails follow.



ERROR 1050Table 'juegos' already exists

SQL Statement
:

CREATE TABLE `juegos` (

  `
idjuegosint(11NOT NULL,

  `
nombreJuegovarchar(45) DEFAULT NULL,

  `
plataformavarchar(45) DEFAULT NULL,

  `
distribuidorint(11) DEFAULT NULL,

  `
desarrolladorint(11) DEFAULT NULL,

  `
descripciontext,

  
PRIMARY KEY (`idjuegos`),

  
KEY `distribuidor_compania` (`distribuidor`),

  
KEY `desarrollador_compania` (`desarrollador`),

  
CONSTRAINT `distribuidor_companiaFOREIGN KEY (`distribuidor`) REFERENCES `compania` (`idDistrib`) ON DELETE NO ACTION ON UPDATE NO ACTION

ENGINE=InnoDB DEFAULT CHARSET=latin1 


Nota: Los nombres de las claves primarias son distintas a lo que he dicho por que es una prueba aparte que estoy haciendo, pero viene a ser lo mismo.

Viendo este error, lo que pense fue crear las tablas desarrollador (idDesarrollador, logo, nombre, fechaSalida, descripcion) y distribuidor (idDistribuidor, logo, nombre, fechaSalida, descripcion) para que en la tabla juegos cada campo apunte a una tabla.

Ahora resulta que tengo 3 tablas exactas para lo mismo, y lo que me gustaria es tener una (companias) que era el objetivo del principio y no supe hacerlo. Mi pregunta es, se puede hacer esto en una tabla ??, tengo entendido que se pueden crear dos claves foraneas apuntando a una misma tabla, no??, espero que me puedan ayudar.

Una ultima dudita antes de acabar la entrada de relaciones.

Resulta que todas mis consultas que realizo con relaciones las hago de la siguiente forma.

Suponiendo que quiero sacar el nombre de distribuidor de los juegos...

Código PHP:
SELECT nombreJuego,distribuidor.distribuidor FROM juegos,distribuidor WHERE juegos.distribuidor=distribuidor.iddistribuidor
En cambio he leido que usar INNER JOIN es mucho mejor para las relaciones por lo que la consulta anterior quedaria asi.

Código PHP:
SELECT nombreJuego,distribuidor.distribuidor FROM juegos INNER JOIN distribuidor ON juegos.distribuidor=distribuidor.idDistribuidor
Me sale exactamente lo mismo. Entonces para que deberia usar INNER JOIN respecto a la primera consulta??, o con INNER JOIN se gana velocidad en consulta o son mas depuradas??, no se

Muchas gracias por su ayuda.
  #2 (permalink)  
Antiguo 03/07/2012, 06:02
Avatar de jpint  
Fecha de Ingreso: junio-2012
Ubicación: Ciudad Real - España
Mensajes: 97
Antigüedad: 11 años, 10 meses
Puntos: 12
Respuesta: Duda con varias relaciones (FK) a una misma tabla

en principio no debe haber ningun problema en relacionar una tabla con otra mediante 2 FKS, sin embargo no tiene mucho sentido.
si lo que quieres es relacionar una tabla con otra que tiene PK compuesta, no tienes que poner 2 FKS si no una FK compuesta tal que asi

CONSTRAINT `distribuidor_compania` FOREIGN KEY ('distribuidor','compania') REFERENCES `compania`

lo has probado asi


lo del INNER JOIN tiene que ver con que no hace producto cartesiano y agrupa mas rapido si las filas estan indexadas,creo que es algo de eso

Etiquetas: mysql
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:19.