2013-01-20 68 views
0

我想设计一个数据库,但是在setupping外键时遇到困难。我使用InnoDB和phpMyAdmin。1列的两个外键?

我有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)。

正如你可能看到我需要附加files.id与2个外键 - contacts.files_id,orders.files_id。我不知道该怎么做,或者甚至有可能。任何想法?

回答

0

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

您需要为order_id + files_id和contact_id + files_id, 另外添加两个映射表,您应该生成files.file_id和主键。

+0

它们将允许每个订单或联系人多个文件,因为files.file_id不是唯一的。 – barakuda28

+0

但订单和联系人都无法存储多个file_id。例如, – Gereon

+0

contacts.files_id将为15456。所以你可以有多少记录在“文件”ID为15456. files.file_id不是唯一的:) – barakuda28

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(主键,)
  • 文件名
+0

+1 - 但是,值得注意的是,删除订单或联系人记录只会删除相关“* _Files”表中的*关系*:它会将底层记录留在'files'表中。 (另一方面,如果订单或联系人(而不是对象)被删除,我的答案将不会级联)。 – eggyal

+0

@eggyal aha,我的意思是他们不再有这些文件。现在我明白了。我错过了。谢谢。 –

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都将一起删除。

+0

+1,你的更好。 –