0

我正在尝试设计一个数据库,但在设置外键时遇到了困难。我使用 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 个或多个文件。我正在尝试设置外键,因此当我删除联系人或订单时,它会自动删除所有引用的文件(DELETE 上的 CASCADE)。

如您所见,我需要使用 2 个外键附加 files.file_id - contacts.files_id、orders.files_id。我不知道该怎么做,或者是否有可能。有任何想法吗?

4

3 回答 3

2

你可以这样做:

1) 订单

  • order_id
  • 订单详细信息

2) 联系人

  • 联系人 ID
  • 联系方式

3)orders_Files

  • order_id
  • 文件标识

4) 联系人文件

  • Contact_id(FK),
  • 文件标识

5) 文件

  • file_id(主键,)
  • 文件名
于 2013-01-20T13:11:51.130 回答
2

@MahmoudGamal 的答案的替代方法是考虑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都将被删除。

于 2013-01-20T13:15:48.287 回答
0

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

您将需要两个额外的 order_id+files_id 和 contact_id+files_id 映射表,并且您应该创建 files.file_id 和主键。

于 2013-01-20T13:11:41.500 回答