1

我有一個order表,該表中的每個訂單屬於devicepart(這兩個在字段中沒有特定的交集)。
所以我需要將didpid作爲FK存儲在order表中。外鍵從SQL中的一列中的兩個表中刪除

"device" 
+----+.... 
| id |<---------+ 
+----+....  : 
: : : : .  : 
       : 
       : 
"part"   : 
+----+....  : 
| id |<-------+ : 
+----+.... : : 
: : : : .  : : 
       : : 
       : : 
    "order" @ @ 
    +-----+-------+.... 
    | id | for |.... 
    +-----+-------+.... 
    : : : : : : : : . 

現在我該怎麼做?

  • 一個type字段添加到order表並存儲於 一列兩個piddid(例如for
  • typepiddid
  • 創建的中間視圖中創建一個更高的水平表(例如, goods)並使其PK爲order,part,device

哪一個是最好的方法?或者其他一些方法?

+2

http://stackoverflow.com/questions/2895147/database-design-or-relation/2897732#2897732 http://stackoverflow.com/questions/4050784/defining-multiple-foreign-keys-in-one - 表到多桌/ 4051523#4051523 –

回答

2

要麼使用排斥外鍵繼承,作爲解釋here。只需要注意CHECK,這是MySQL的not enforced,所以你必須通過觸發器「模擬」它。

請不要做「類型」的方法,它可以導致problems

0

如果是我,我會創建以下FK字段:didpid。你總是會有一個價值,而不是另一個。

您的查詢看起來像以下:

SELECT o.*, COALESCE(p.descr, d.descr) AS Description, 
      COALESCE(p.number, d.number) AS PNumber 
FROM order o 
LEFT JOIN device d ON o.did = d.id 
LEFT JOIN part p ON o.pid = p.id 
1

我會去的兩個表,一個是爲了和其他的項目。項目表將有ID,類型(部分或設備; P或D)和其他細節。在訂單表中,我將只有一個FK到項目表ID。