2013-01-20 98 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,你的更好。 –