【问题标题】:One to many relationship MYSQL一对多关系MYSQL
【发布时间】:2019-12-02 19:45:38
【问题描述】:

我是 mysql 新手,正在尝试链接两个表,但不确定如何链接,我有一个产品表,其中包含餐厅的产品列表,该表中的列是

  • ID(主键)
  • 姓名
  • 价格

另一张桌子叫做 extras,这张桌子包含额外的东西,您可以添加到您的订单中,但是是可选的,因为在购买鸡肉时,您可以选择辣和不辣, 有些产品有不止一个附加功能,例如一个产品可以选择三个附加功能。

目前的临时表只有

  • ID(主键)
  • 姓名

不确定如何将两者联系起来或将外部约束放在哪里。

更新

同样的额外也可能属于许多产品

【问题讨论】:

  • 您只需将 product_id 添加到您的额外表中
  • 通常人们会期望“extras”表中的某个外键字段指向“products”表。 F.e.类似:extras.product_id --> products.id
  • 看起来这两个表无法链接,因为附加项的数量似乎会根据您希望拥有一张 product_extras 表的产品而有所不同。该表只需要两列,一列用于产品 ID,另一列用于附加 ID。
  • 在上面提到的@JoshGivens 之上,您可能需要在产品表中的一个字段来指示额外的限制(例如:“最多选择 3 个额外的”)。 ...并且您可能需要区分“额外”和“选项”(例如:比萨饼通常带有“选择 x 配料”优惠,但不要将酱汁选择算作“配料”)
  • 如果某个额外的(如“辣”)可能适用于不止一种产品(“鸡肉”、“牛肉”、“猪肉”……),那么您就有了多对多关系,并且需要一个单独的表来连接两者:extra_product,带有两个外键 product_id 和 extra_id。

标签: mysql sql


【解决方案1】:

加入/链接表通常通过加入 2 个父表/主键来使用多对多关系,以允许许多产品具有许多附加功能或根本没有附加功能。

例如:

例如: 产品 ID(主键)为:1、2、3 产品名称为:鸡翅、鸡胸肉、鸡柳

额外的 ID(主键)是:1、2、3 附加名称是:温和、中等、热

鸡翅、胸肉和鱼片可以选择所有三个附加项,因此 product_extras 表最终看起来像这样:

product_extras_id | product_id | extras_id
------------------------------------------
1                 | 1          | 1
2                 | 1          | 2
3                 | 1          | 3
4                 | 2          | 1
5                 | 2          | 2
6                 | 2          | 3
7                 | 3          | 1
8                 | 3          | 2
9                 | 3          | 3

【讨论】:

    【解决方案2】:

    对于具有许多附加功能的产品和适用于许多产品的附加功能,这实际上是多对多关系。

    create table products(ID int auto_increment Primary Key,
    Name varchar(50),
    Price decimal(6,2));
    
    create table extras(ID int auto_increment Primary Key,
    Name varchar(50));
    
    create table product_extras(Product int Not Null,
    Extra int Not Null,
    FOREIGN KEY(Product) References products(ID) ON DELETE CASCADE,
    FOREIGN KEY(Extra) References extras(ID) ON DELETE CASCADE);
    

    类似的东西应该适合您,尽管您可能希望根据偏好和实际需要进入的数据来更改数据类型。

    【讨论】:

      【解决方案3】:

      在您的情况下,一种产品可能有许多附加功能(一对多),而许多产品可能具有相同的附加功能(多对一)。因此,这是一个多对多关系,对于这种关系,我们需要 3 个表。

      CREATE TABLE products ( 
          id INT PRIMARY KEY AUTO_INCREMENT, 
          name VARCHAR(50), 
          price DECIMAL(10.2)
       );
      
       CREATE TABLE extras (
            id INT PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(50)
       );
      
       CREATE TABLE products_extras (
            id INT PRIMARY KEY AUTO_INCREMENT,
            pro_id INT,
            FOREIGN  KEY(pro_id) REFERENCES products(id),
            ext_id INT,
            FOREIGN KEY(ext_id) REFERENCES extras(id)
       );
      

      【讨论】:

        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2014-12-11
        • 2011-04-05
        • 1970-01-01
        相关资源
        最近更新 更多