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

[Consulta] Claves Foraneas.

Estas en el tema de [Consulta] Claves Foraneas. en el foro de Mysql en Foros del Web. Buenas, tengo una consulta, sobre un esquema de tablas, con referencias, claves foraneas, y bueno, el tema de bases relacionales... les paso a explicar, tengo ...
  #1 (permalink)  
Antiguo 20/05/2009, 14:26
Avatar de Hiruma-Sama  
Fecha de Ingreso: agosto-2007
Ubicación: Floresta, Buenos Aires, Argentina.
Mensajes: 234
Antigüedad: 16 años, 7 meses
Puntos: 5
Pregunta [Consulta] Claves Foraneas.

Buenas, tengo una consulta, sobre un esquema de tablas, con referencias, claves foraneas, y bueno, el tema de bases relacionales...
les paso a explicar, tengo una tabla con usuarios y passwords, para un login, por otro lado, cada uno de esos usuarios, van a tener una "Mochila" , con diferentes "Items" y variadas cantidades de estos en la mochila...

Ahora bien, le paso a mostrar como lo planifique y como lo codifique, y lo que necesitaria, es que me digan, si es correcto el "diseño" o si se puede optimizar o mejorar, de manera de conseguir los resultados esperados, y por otro lado ver si el codigo es correcto, porque en si, aca donde estoy no lo puedo probar, y hasta el viernes, supongo que no podre probarlo y quiero llegar al viernes con el codigo bien armado.


===========================================


Tabla Usuarios:

Columnas:

ID_USUARIO ; NOMBRE ; PASSWORD ;


Tabla Mochila:

Columnas:

// Supongo que quedaria asi la tabla, con esta es la que tengo mas dudas.

ID_MOCHILA ; ID_USUARIO ; ID_ITEM ; CANTIDAD ;
5 ; 001 ; 333 ; 10 ;
5 ; 001 ; 258 ; 23 ;
6 ; 002 ; 333 ; 26 ;
5 ; 001 ; 389 ; 18 ;
6 ; 002 ; 158 ; 19 ;

Tabla Item:

Columnas:

ID_ITEM ; DESCRIPCION ; PRECIO ;


===========================================


CREATE TABLE usuarios(

id_usuarios INT NOT NULL,
usuario_login VARCHAR(30),
password VARCHAR (30),
PRIMARY KEY (id_usuarios)

) TYPE = INNODB;


CREATE TABLE mochila (

id_mochila INT NOT NULL,
id_usuarios INT NOT NULL,
id_item INT NOT NULL,
cantidad INT,
PRIMARY KEY (id_mochila),
INDEX (id_usuarios),
FOREIGN KEY (id_usuarios) REFERENCES usuarios(id_usuarios),
INDEX (id_item),
FOREIGN KEY (id_item) REFERENCES item(id_items)

) TYPE = INNODB;


CREATE TABLE item (

id_item INT NOT NULL,
descripcion TEXT,
PRIMARY KEY (id_item)

) TYPE = INNODB;


===========================================

Desde ya muchisimas gracias por su atencion ^^
  #2 (permalink)  
Antiguo 20/05/2009, 16:30
Avatar de 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.

Hola, la relacion que armas entre usuarios e item que se llama mochila esta mal planteada en cuanto a la llave primaria. Segun tu ejemplo id_mochila "5" se repite, eso no puede pasar ya que has definido ese campo como llave primaria. Debes tener en cuenta que si deseas que se cumpla la restriccion de que cada usuario solo deba posser una y solo una mochila entonces tienes una relacion 1 a 1 entre usuario y mochila. Y luego puedes armar una relacion de 1 a n entre mochila e item. De esa tabla tendria como claves primarias el usuario la mochila y el item,y un campo adicional para la cantidad. Entonces no puede suceder el caso en el que un usuario tenga mas de una mochila, y que un item se repitan dentro de esa mochila, de esa manera tendrias la integridad asegurada. Eso es lo que entendi de acuerdo a como planteaste el contexto del problema.
Saludos
__________________
->Aprender es un proceso que incluye el error..
  #3 (permalink)  
Antiguo 20/05/2009, 20:32
Avatar de Hiruma-Sama  
Fecha de Ingreso: agosto-2007
Ubicación: Floresta, Buenos Aires, Argentina.
Mensajes: 234
Antigüedad: 16 años, 7 meses
Puntos: 5
Respuesta: [Consulta] Claves Foraneas.

es verdad lo que decis, y la verdad es que esa duda es la que tenia realmente, la de la relacion 1 a n de mochila a items. por la simple razon de que no "veo" como quedaria en una tabla de ejemplo, pero bueno, mira ahi retoque el codigo, y como no estoy muy acostumbrado a estos codigos, pido ayuda para ver si me lo pueden corregir.

====================

CREATE TABLE usuarios(

id_usuarios INT NOT NULL,
usuario_login VARCHAR(30),
password VARCHAR (30),
PRIMARY KEY (id_usuarios)

) TYPE = INNODB;


CREATE TABLE mochila (

id_mochila INT NOT NULL,
id_usuarios INT NOT NULL,
id_item INT NOT NULL,
cantidad INT,
PRIMARY KEY (id_mochila),
PRIMARY KEY (id_item),
PRIMARY KEY (id_item),
INDEX (id_usuarios),
FOREIGN KEY (id_usuarios) REFERENCES usuarios(id_usuarios),
INDEX (id_item),
FOREIGN KEY (id_item) REFERENCES item(id_items)

) TYPE = INNODB;


CREATE TABLE item (

id_item INT NOT NULL,
descripcion TEXT,
PRIMARY KEY (id_item)

) TYPE = INNODB;

====================

si este codigo es correcto, tomando el cambio que intente aplicar segun el comentario de Cala, ya estarian todas mis dudas ^^
  #4 (permalink)  
Antiguo 21/05/2009, 05:30
Avatar de 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..
  #5 (permalink)  
Antiguo 21/05/2009, 10:37
Avatar de Hiruma-Sama  
Fecha de Ingreso: agosto-2007
Ubicación: Floresta, Buenos Aires, Argentina.
Mensajes: 234
Antigüedad: 16 años, 7 meses
Puntos: 5
Respuesta: [Consulta] Claves Foraneas.

habia varios aspectos del codigo que desconocia, los voy a ir estudiando paso a paso, y la verdad que de los dos casos, para lo que es mi sistema, el primary key en mochila no deberia ir puesto que no seria correcto que un usuario tenga mas de una mochila, asique voy a empezar a probar el codigo mañana y a aprovechar todo el finde, desde ya muchas gracias ^^
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 00:00.