1列的两个外键?

时间:2013-01-20 13:07:11

标签: mysql foreign-keys

我正在尝试设计一个数据库,但是我在设置外键时遇到了困难。我使用InnoDB和phpMyAdmin。

我有3张桌子:

1) orders
- order_id
- order_details
- files_id

2) contacts
- contact_id
- contact_details
- files_id

3) files
- filе_id (not primary key, just index)
- filename

这个想法如下:联系人和订单可以附加0个或更多文件。我正在尝试设置外键,所以当我删除联系人或订单时,它会自动删除所有引用的文件(DELCAD上的CASCADE)。

您可能会看到我需要附加带有2个外键的files.file_id - contacts.files_id,orders.files_id。我不知道该怎么做或者甚至可能。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

1)订单

  • ORDER_ID
  • ORDER_DETAILS

2)联系

  • CONTACT_ID
  • contact_details

3)orders_Files

  • ORDER_ID
  • 的file_id

4)contacts_Files

  • CONTACT_ID(FK),
  • 的file_id

5)文件

  • filе_id(主键,)
  • 文件名

答案 1 :(得分:2)

@MahmoudGamal's answer的替代方法是将orderscontacts视为更具体的通用object类型:

CREATE TABLE object (
  object_id       SERIAL
);

CREATE TABLE orders (
  order_id        SERIAL,
  order_details   TEXT,
  object_id       BIGINT UNSIGNED NOT NULL,
  UNIQUE (object_id),
  FOREIGN KEY (object_id) REFERENCES object (object_id) ON DELETE CASCADE
);

CREATE TABLE contacts (
  contact_id      SERIAL
  contact_details TEXT,
  object_id       BIGINT UNSIGNED NOT NULL,
  UNIQUE (object_id),
  FOREIGN KEY (object_id) REFERENCES object (object_id) ON DELETE CASCADE
);

然后文件与objects

相关联
CREATE TABLE files (
  file_id         SERIAL,
  filename        TEXT
  object_id       BIGINT UNSIGNED NOT NULL,
  FOREIGN KEY (object_id) REFERENCES object (object_id) ON DELETE CASCADE
);

现在,当您删除object时,相关的ordercontact以及所有关联的files都将被删除。

答案 2 :(得分:0)

这些表格不允许每个订单或联系人拥有多个文件。

对于order_id + files_id和contact_id + files_id,您还需要两个额外的映射表, 你应该制作files.file_id和主键。