2011-03-02 31 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

相关问题