2011-03-02 50 views
1

我有兩個表PC_Build表由PcID(主鍵),FinalCost和PartID組成。我還有一個PartID(主鍵),Part_Name,Cost的Parts表。我的PC_Build可能有多個PartID,鏈接到Parts表嗎?我也可以通過從部件中獲取成本,並將其添加到PC_Build中的FinalCost變量中,從構建中使用的部件總和中計算PC_Build的成本。MySQL,是否有可能在一個表中查看來自不同表的值的多個外鍵值?

+1

需要多對多的關係。 http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php – 2011-03-02 23:47:53

+0

@Imre添加此鏈接到我的答案,因爲它是很好的信息。 – 2011-03-03 09:32:50

回答

5

是。這是完全允許的。只要列和外鍵的命名方式不同,您可以根據需要爲同一個表創建多個外鍵。

然而,對於您所描述的情況,這不一定是個好主意。它打破normalisation,你將有問題,如果可以是PC的RAM在它同枝的4和其他具有8或PC具有3級的CPU,但另一個具有1.您將如何處理這種情況?如果您使用外鍵,則需要不斷更改表格以適應所有不同的情況。

它可能會更好,以有有兩列,PCID和PARTID一個PC_Build_Part表。然後,您可以使用連接來簡單地確定哪些部件屬於哪個PC。

下面是一個例子模式:

PC(PCID,BuildCost)

部分(PARTID,零件名稱,PartCost)

PC_Part(PCIDPARTID

這就是所謂的many-to-many relationship

要計算BuildCost列,你可以做一個查詢如下所示:

SELECT SUM(p.PartCost) as TotalCost 
FROM Part p 
JOIN PC_Part pcp ON pcp.PartID = p.PartID 
JOIN PC pc ON pc.PcID = pcp.PcID 

這將讓您可以靈活處理多種不同的電腦配置,而無需改變你的架構。

+0

所以你說的是什麼,如果我只是做了柱的每個部分,所以讓我們說,例如,一個CPU列,只要給它的產品編號,在零件表中的CPU的之一。它會打破正常化。你的建議是有第三個表,將PC_Build鏈接到PC_Build_Part到零件。我如何獲得與PC構建相關的部分的成本,以增加PC的最終成本,只有在查詢中才有可能? – 2011-03-02 23:45:57

+0

不要爲每個零件製作一個列。看我的示例架構。 – 2011-03-02 23:47:38

+0

你未必需要BuildCost欄,你可以做到這一點與查詢 - 我添加了答案。 – 2011-03-02 23:48:23

1

如果每個零件都屬於某個PC,那麼您需要在Parts表中添加一個PcID列並從PC_Build表中刪除該PartID。如果您有固定的部件目錄,每臺PC可以由多個部件組成,並且每個部件可以在多臺PC中使用,那麼您需要一個附加表格(PC_to_Part),您可以在其中獲得PcID和PartID。

是,假設前一種方法,你可以找到每一個PC的使用查詢的成本像

SELECT PcID, SUM(Cost) 
FROM PC_Build 
JOIN Parts ON (Parts.PcID = PC_Build.PcID) 
GROUP BY PcID 
+0

謝謝:)我會試試看看它是否能完成這項工作! – 2011-03-02 23:50:01

+0

在這種架構中的一部分只能屬於一臺PC,這不一定是錯的,只是爲了說清楚。 – 2011-03-02 23:53:51

+0

如何將多個部件鏈接到一臺PC?因爲個人電腦需要一個CPU,主板,電源,拉姆等...我應該有一個桌子,每種類型的零件鏈接到一個電腦表? – 2011-03-03 00:10:54

相關問題