Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/07/2012, 04:52
Hekaly
 
Fecha de Ingreso: enero-2010
Mensajes: 30
Antigüedad: 14 años, 4 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.