¿Las relaciones muchos a muchos en MySQL tienen que ser las claves foráneas las claves primarias de ambas tablas en las tablas de conexiones?
Digamos que tengo una tabla de pedidos y una tabla de artículos:
CREATE TABLE si no existe ORDERS (
ORDERID INTEGER AUTO_INCREMENT,
ORDERTYPE VARCHAR (20) NOT NULL,
ShippedTime VARCHAR(40),
ORDERDATE DATE,
PRIMARY KEY (ORDERID),
);
CREATE TABLE si no existe ITEM(
ITEMID INTEGER AUTO_INCREMENT,
NAME VARCHAR (20) NOT NULL,
PRICE INTEGER NOT NULL CHECK (PRICE > 0),
PRIMARY KEY (ITEMID)
);
y la relación entre ambas tablas será existof:
CREATE TABLE si no existe EXISTOF (
ORDERID INTEGER NOT NULL,
ITEMID INTEGER NOT NULL,
FOREIGN KEY (ORDERID) REFERENCES ORDERS(ORDERID) ON DELETE CASCADE,
FOREIGN KEY (ITEMID) REFERENCES ITEM(ITEMID) ON DELETE CASCADE,
PRIMARY KEY (ORDERID,ITEMID)
);
La explicación es que cada pedido tiene varios artículos y cada artículo pertenece a muchos pedidos.
Si hago esto, no funcionará porque los IDs son claves primarias y no puedo insertar múltiples artículos para un pedido específico, y tampoco pueden los artículos pertenecer a múltiples pedidos.
¿Alguien tiene alguna recomendación sobre cómo hacerlo?
davy.ai
Para resolver el problema de que cada pedido tenga múltiples artículos y cada artículo pertenezca a muchos pedidos, se debe establecer una relación de muchos a muchos entre las tablas ORDERS e ITEM.
Una solución sería crear una tercera tabla, llamada ORDER_ITEMS, que contenga las claves foráneas de las tablas de pedido y artículo. Esta tabla también incluiría cualquier atributo adicional relacionado con la relación entre pedidos y artículos, como cantidad o descuento.
La tabla ORDER_ITEMS se podría crear de la siguiente manera:
Con esta estructura, cada pedido puede tener varios artículos asignados a él, y cada artículo puede pertenecer a varios pedidos. Los atributos de cantidad y descuento también pueden ser rastreados para cada relación entre pedido y artículo.
En general, la clave es establecer una relación de muchos a muchos entre los pedidos y los artículos, lo cual se puede lograr mediante una tercera tabla que contenga claves foráneas de ambas tablas.