Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/05/2009, 05:30
Avatar de cala932
cala932
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: [Consulta] Claves Foraneas.

Buenas nuevamente Hiruma-Sama, veamos lo siguiente:

- Si cada usuario unicamente va a tener una y solo una mochila la relacion quedaria de la siguiente manera:
Suponiendo que la base de datos se llame prueba.
Código:
CREATE SCHEMA IF NOT EXISTS `prueba` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `prueba`;

-- -----------------------------------------------------
-- Table `prueba`.`usuario`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`usuario` (
  `id_usuario` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_usuario`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `prueba`.`item`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`item` (
  `id_item` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `descripcion` VARCHAR(45) NULL ,
  PRIMARY KEY (`id_item`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `prueba`.`mochila`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`mochila` (
  `id_usuario` INT NOT NULL ,
  `id_item` INT NOT NULL ,
  `cantidad` INT NULL ,
  PRIMARY KEY (`id_usuario`, `id_item`) ,
  INDEX `fk_usuario_has_item_usuario` (`id_usuario` ASC) ,
  INDEX `fk_usuario_has_item_item` (`id_item` ASC) ,
  CONSTRAINT `fk_usuario_has_item_usuario`
    FOREIGN KEY (`id_usuario` )
    REFERENCES `prueba`.`usuario` (`id_usuario` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_usuario_has_item_item`
    FOREIGN KEY (`id_item` )
    REFERENCES `prueba`.`item` (`id_item` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
De esta manera cada usuario tiene una sola mochila en la que puede ir añadiendo los items que desee y asegurando que el mismo no se repita. Si te fijas quite como clave primaria el id_mochila porque eso permitiria que un usuario puediese tener mas de una mochila.

- Ahora si cada usuario puede tener mas de una mochila, entonces la relacion quedaria de la siguiente manera:
Código:
CREATE SCHEMA IF NOT EXISTS `prueba` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `prueba`;

-- -----------------------------------------------------
-- Table `prueba`.`usuario`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`usuario` (
  `id_usuario` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_usuario`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `prueba`.`item`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`item` (
  `id_item` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `descripcion` VARCHAR(45) NULL ,
  PRIMARY KEY (`id_item`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `prueba`.`mochila`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `prueba`.`mochila` (
  `id_mochila` INT NOT NULL AUTO_INCREMENT ,
  `id_usuario` INT NOT NULL ,
  `id_item` INT NOT NULL ,
  `cantidad` INT NULL ,
  PRIMARY KEY (`id_mochila`, `id_usuario`, `id_item`) ,
  INDEX `fk_usuario_has_item_usuario` (`id_usuario` ASC) ,
  INDEX `fk_usuario_has_item_item` (`id_item` ASC) ,
  CONSTRAINT `fk_usuario_has_item_usuario`
    FOREIGN KEY (`id_usuario` )
    REFERENCES `prueba`.`usuario` (`id_usuario` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_usuario_has_item_item`
    FOREIGN KEY (`id_item` )
    REFERENCES `prueba`.`item` (`id_item` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Espero que te sirva.

Saludos
__________________
->Aprender es un proceso que incluye el error..