MySQL,是否有可能在一个表中有多个外键值来查看来自不同表的值?

时间:2011-03-02 23:38:17

标签: mysql

我有两个表,一个PC_Build表,包含一个PcID(主键),一个FinalCost和一个PartID。我还有一个Parts表,它有PartID(主键),Part_Name,Cost。我的PC_Build是否可以有多个PartID,链接到Parts表???我也可以通过从部件中获取成本,并将其添加到PC_Build中的FinalCost变量,从构建中使用的部件总和计算PC_Build的成本。

2 个答案:

答案 0 :(得分:5)

是。这是完全允许的。只要列和外键的名称不同,您就可以拥有任意数量的外键到同一个表。

但是,对于您描述的情况,这不一定是个好主意。它会中断normalisation,如果PC中有4个相同的RAM,而另一个有8个,或者PC有3个CPU而另一个有1个CPU,那么你会遇到问题。你将如何处理这种情况?如果您使用外键,则需要不断更改表格以适应所有不同的情况。

拥有一个包含两列PcID和PartID的PC_Build_Part表可能会更好。然后,您可以使用联接来简单地确定哪些部件属于哪台PC。

这是一个示例模式:

PC( PcID ,BuildCost)

部分( PartID ,PartName,PartCost)

PC_Part( PcID PartID

这称为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

这样您就可以灵活地处理许多不同的PC配置,而无需更改架构。

答案 1 :(得分:1)

如果每个部件都属于某个PC,那么您需要将PcID列添加到Parts表中,并从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