【问题标题】:Foreign Key relationships are not making sense, is there a better way?外键关系没有意义,有更好的方法吗?
【发布时间】:2015-06-03 04:53:04
【问题描述】:

我在尝试了解我的表在我的数据库中应该如何关联时遇到了问题。我是一个初学者,并试图自己研究。表格如下

    CREATE TABLE PIZZA
(
    pizza_id INT AUTO_INCREMENT PRIMARY KEY,
    pizza_name VARCHAR (255),
    pizza_desc VARCHAR (255),
    pizza_price DOUBLE
);

CREATE TABLE CUSTOMER
(
    cust_id INT AUTO_INCREMENT PRIMARY KEY,
    cust_first_name VARCHAR (255),
    cust_last_name VARCHAR (255),
    cust_street VARCHAR (255),
    cust_apt VARCHAR (255),
    cust_city VARCHAR (255),
    cust_state CHAR(2),
    cust_zip CHAR(5),
    cust_home_phone CHAR(10),
    cust_mobile_phone CHAR(10),
    cust_other_phone CHAR(10)
);

CREATE TABLE PIZZA_ORDER
(
    pizza_order_id INT AUTO_INCREMENT PRIMARY KEY,
    pizza_id INT,
    cust_id INT,
    order_date TIMESTAMP,
    order_quantity INT,
    order_notes VARCHAR (255),
    FOREIGN KEY (pizza_id) REFERENCES PIZZA(pizza_id),
    FOREIGN KEY (cust_id) REFERENCES CUSTOMER(cust_id)
);

我的问题是,如果 PIZZA_ORDER 表中的记录让我们说两个不同的披萨,这意味着两个不同的披萨 ID,这将如何工作?我正在考虑让 PIZZA_ORDER 的主键不唯一,并且每个实际订单都有 x 条记录。但我不确定这将如何工作。再次感谢你们对此有所了解。

【问题讨论】:

  • 你的 Pizza 表需要一个 Pizza_Order 表的外键,你有它向后
  • 您,先生,那里有一个多对多的关系。见stackoverflow.com/questions/1273715/…
  • @kittykittybangbang 谢谢,是的,我有一个多对多的比萨饼和比萨饼订单。我想在未来,如果可能的话,我应该尽量避免多对多。感谢您的帮助。
  • 不,不要被吓跑! :) 多对多关系,如果处理得当,可以是一件美好的事情。

标签: mysql database foreign-keys


【解决方案1】:

一个销售订单有许多销售订单行项目

create table orders (
  id int primary key,
  ...
);

create table order_items (
  order_id int references orders(id),
  line int,
  pizza_id int references pizza(id),
  ...
  primary key (order_id, line)
);

请查看https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831 以节省时间:)

【讨论】:

  • 这正是我最终要做的,我消除了多对多关系并创建了一个引用订单和产品的附加 LINE_ITEMS 表。然后我只开发了表之间的一对多关系。感谢您的帮助
【解决方案2】:

您应该在pizza_orderpizza 表之间以及Customerpizza_order 表之间建立关系。这就像说,每个披萨都与一个/多个披萨订单有关;而每个披萨订单都与一个/多个客户相关。

CREATE TABLE PIZZA_ORDER
(
    pizza_order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date TIMESTAMP,
    order_quantity INT,
    order_notes VARCHAR (255),
    cust_id int,
    FOREIGN KEY (cust_id) REFERENCES CUSTOMER(cust_id)
);

CREATE TABLE PIZZA
(
    pizza_id INT AUTO_INCREMENT PRIMARY KEY,
    pizza_name VARCHAR (255),
    pizza_desc VARCHAR (255),
    pizza_price DOUBLE,
    pizza_order_id INT,
    FOREIGN KEY (pizza_order_id) REFERENCES PIZZA_Order(pizza_order_id)
);

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2023-01-31
    • 2011-02-17
    相关资源
    最近更新 更多