我正在尝试设计一个数据库,但是我在设置外键时遇到了困难。我使用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。我不知道该怎么做或者甚至可能。有什么想法吗?
答案 0 :(得分:2)
您可以这样做:
1)订单
2)联系
3)orders_Files
4)contacts_Files
5)文件
答案 1 :(得分:2)
@MahmoudGamal's answer的替代方法是将orders
和contacts
视为更具体的通用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
时,相关的order
或contact
以及所有关联的files
都将被删除。
答案 2 :(得分:0)
这些表格不允许每个订单或联系人拥有多个文件。
对于order_id + files_id和contact_id + files_id,您还需要两个额外的映射表, 你应该制作files.file_id和主键。