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

Como repetir llave foranea en tabla compuesta

Estas en el tema de Como repetir llave foranea en tabla compuesta en el foro de Mysql en Foros del Web. Tengo un problema, en la universidad nos han dejado un proyecto para una empresa, mi problema consiste en la estructura de la base de datos, ...
  #1 (permalink)  
Antiguo 11/05/2012, 16:24
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Como repetir llave foranea en tabla compuesta

Tengo un problema, en la universidad nos han dejado un proyecto para una empresa, mi problema consiste en la estructura de la base de datos, tengo 2 tablas, una es la usuarios (usuario como Pk), y productos (producto como PK), y sucede que cuando quiero registrar una compra en usuarios_productos, no puedo repetir el producto que va a comprar, este es mi diagrama relacional, espero me puedan ayudar a superar esto!





La tabla es la siguiente

create table usuarios(
usuario varchar(10) PRIMARY KEY,
password varchar(20),
nombre varchar(20),
apellidos varchar(30),
direccion varchar(50),
correo varchar(30),
telefono varchar(20));

Create table productos(
id_producto int PRIMARY KEY,
nombre varchar(30),
precio int,
existencias int);

create table usuarios_productos(
usuario varchar(10),
id_producto,
nombre int,
fecha_compra date,
PRIMARY KEY (usuario,id_producto),
FOREIGN KEY (usuario) REFERENCES usuarios(usuario),
FOREIGN KEY (nombre) REFERENCES productos(id_producto));
  #2 (permalink)  
Antiguo 11/05/2012, 21:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como repetir llave foranea en tabla compuesta

La PK de la tabla relacional debe estar compuesta por las dos PK de las otras dos tablas, mas por lo menos un campo como discriminante, que podría ser la fecha de compra.
Eso traería una restricción adicional: que el mismo usuario no pueda comprar dos veces el mismo producto en el mismo día. Para resolverlo la fecha debe ser de formato DATETIME, ya que no puede hacer dos compras simultáneas de lo mismo (sería la misma compra):
Código MySQL:
Ver original
  1. CREATE TABLE usuarios_productos(
  2. usuario VARCHAR(10),
  3. id_producto INT,
  4. fecha_compra DATETIME,
  5. PRIMARY KEY (usuario, id_producto, fecha_compra),
  6. FOREIGN KEY (usuario) REFERENCES usuarios(usuario),
  7. FOREIGN KEY (nombre) REFERENCES productos(id_producto));
Nota Bene: No tiene sentido poner el campo "nombre" en la tabla relacional. Ya existe en el de Productos y duplicarlo implicaría riesgo de inconsistencia de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: diagrama, llaves, modelado, foreignkey
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:31.