在mysql中建模一个或多个关系

时间:2014-12-16 05:27:02

标签: mysql database

我想知道如何在mysql中建模以下关系。以下ERD显示了我的设计

enter image description here

订单包含strictly one商品和产品has many订单

这是我到目前为止所做的,并不确定如何强制执行约束

-- Order table
CREATE TABLE Order (
  orderId INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  date DATETIME,
  serialNumber INT NOT NULL
);

-- Address table
CREATE TABLE Product (
  serial_No INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  manufacturer VARCHAR(30) NOT NULL,
  model VARCHAR(30) NOT NULL,
  ram VARCHAR(30) NOT NULL
);

 -- Join table
 CREATE TABLE Order_Product (
     id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     orderId INT NOT NULL,
     serial_No INT NOT NULL
 );

2 个答案:

答案 0 :(得分:0)

根据评论,您需要以下内容。然后,创建一个外键约束,强制Order.productSerial的值必须是Product中的有效serial_NO。 (见http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html)。您可以SELECT * FROM Order where productSerial = (whatever)查找产品的所有订单,或者在Order.productSerial和Product.serial_No之间进行联接。

-- Order table
CREATE TABLE Order (
  orderId INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  productSerial INT(6) NOT NULL,
  date DATETIME,
  serialNumber INT NOT NULL
);

-- Address table
CREATE TABLE Product (
  serial_No INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  manufacturer VARCHAR(30) NOT NULL,
  model VARCHAR(30) NOT NULL,
  ram VARCHAR(30) NOT NULL
);

答案 1 :(得分:0)

请参阅,因为它是一对多的关系,外键足以满足您的要求。在多对多关系的情况下,需要使用附加表来执行关系。

所以这会起作用:

CREATE TABLE Order (
  orderId INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  serial_No INT(6) UNSIGNED ,
  date DATETIME,
  serialNumber INT NOT NULL ,
  foreign key(serial_No) references product(serial_No)
);

CREATE TABLE Product (
  serial_No INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  manufacturer VARCHAR(30) NOT NULL,
  model VARCHAR(30) NOT NULL,
  ram VARCHAR(30) NOT NULL ,
);

使用Join或Subquery获取相关数据。

对于Ex:

产品:

Serial_No制造

1001戴尔

1002 HP

奥得:

orderid Serial_no

101 1001

102 1002

103 1001