【问题标题】:Are multiple foreign keys in a single field possible?单个字段中是否有多个外键?
【发布时间】:2011-08-17 14:04:29
【问题描述】:

我想知道是否有一种方法可以在 MySQL 数据库的单个字段中包含多个值,其中每个值都是引用另一个表的外键。

我正在设计一个包含产品表和产品认证表的数据库。

我正在使用 InnoDB 和外键约束。

“产品”表包含有关产品特定实例的详细信息。产品表中包含的详细信息之一是列“product_certification_id”,它是引用两列“product_certification”表中的索引的外键。

产品认证表包含产品实例可能拥有的认证。

我的问题源于产品认证不是互斥的,所以我很好奇在同一个字段中是否可以有多个外键值引用同一个表。

另外,我担心未来可能会添加更多认证,因此我需要在这个意义上以易于扩展的方式进行设计。

感谢您的意见。

【问题讨论】:

  • 我认为你没有。您可以使用 CSV 语法在一个字段中存储多个 id,但不能使用 MySQL 中内置的外键函数。您必须使用连接表才能在“product”和“product_certification”之间建立多对多关系

标签: php mysql foreign-keys relational-database


【解决方案1】:

您通常做的是与中间链接表建立多对多关系。类似于以下内容:

CREATE TABLE product (
  `id` integer AUTO_INCREMENT NOT NULL,
  -- other cols --
  PRIMARY KEY (`id`)
);

CREATE TABLE certification (
  `id` integer AUTO_INCREMENT NOT NULL,
  -- other cols --
  PRIMARY KEY (`id`)
);

CREATE TABLE product_certification (
   `product_id` integer NOT NULL,
   `certification_id` integer NOT NULL,
   PRIMARY KEY (`product_id`, `certification_id`),
   CONSTRAINT `product_id_product_id` 
     FOREIGN KEY (`product_id`) 
     REFERENCES `product` (`id`) ON DELETE CASCADE,
   CONSTRAINT `certification_id_certification_id` 
     FOREIGN KEY (`certification_id`) 
     REFERENCES `certification` (`id`) ON DELETE CASCADE
);

【讨论】:

    【解决方案2】:

    如果我理解正确,关系 product : product_certification1:M 您可以通过product_id 创建从product_certificationproducts 的外键,而不是在products 表中使用product_certification_id(这是无效的,因为产品可以拥有多个认证)

    【讨论】:

      【解决方案3】:

      单个字段不能是另一个表中多个字段的外键。这是不可能的。由于您的外部表具有复合键,因此您的表也必须具有相同的字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多