Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL,是否可以在一个表中有多个外键值来查看不同表中的值?_Mysql - Fatal编程技术网

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

MySQL,是否可以在一个表中有多个外键值来查看不同表中的值?,mysql,Mysql,我有两个表—一个PC_构建表,它由一个PcID(主键)、一个FinalCost和一个PartID组成。我还有一个Parts表,其中包含PartID(主键)、Part_名称和成本。我的PC_Build是否可能有多个PartID,即指向零件表的链接???我还可以通过从部件中获取成本并将其添加到PC_Build中的FinalCost变量,从构建中使用的部件的总和计算PC_构建的成本。是。这是完全允许的。只要列和外键的名称不同,同一个表可以有任意多个外键 然而,对于您描述的情况,这不一定是一个好主意。如

我有两个表—一个PC_构建表,它由一个PcID(主键)、一个FinalCost和一个PartID组成。我还有一个Parts表,其中包含PartID(主键)、Part_名称和成本。我的PC_Build是否可能有多个PartID,即指向零件表的链接???我还可以通过从部件中获取成本并将其添加到PC_Build中的FinalCost变量,从构建中使用的部件的总和计算PC_构建的成本。

是。这是完全允许的。只要列和外键的名称不同,同一个表可以有任意多个外键

然而,对于您描述的情况,这不一定是一个好主意。如果一台电脑有4个相同的内存条,而另一台电脑有8个,或者一台电脑有3个CPU,而另一台电脑有1个,那么它就会出现问题。你将如何处理这种情况?如果使用外键,则需要不断更改表以适应所有不同的情况

最好有一个包含两列的PC_Build_Part表,即PcID和PartID。然后,您可以使用连接来简单地计算出哪些部件属于哪台PC

下面是一个示例模式:

PC(PcID,建筑成本)

零件(零件ID,零件名称,零件成本)

PC_部件(PcID,PartID)

这被称为一个

要计算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配置,而无需更改模式。

是。这是完全允许的。只要列和外键的名称不同,同一个表可以有任意多个外键

然而,对于您描述的情况,这不一定是一个好主意。如果一台电脑有4个相同的内存条,而另一台电脑有8个,或者一台电脑有3个CPU,而另一台电脑有1个,那么它就会出现问题。你将如何处理这种情况?如果使用外键,则需要不断更改表以适应所有不同的情况

最好有一个包含两列的PC_Build_Part表,即PcID和PartID。然后,您可以使用连接来简单地计算出哪些部件属于哪台PC

下面是一个示例模式:

PC(PcID,建筑成本)

零件(零件ID,零件名称,零件成本)

PC_部件(PcID,PartID)

这被称为一个

要计算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配置,而无需更改架构。

如果每个部件都属于某台PC,则您需要向部件表添加PcID列,并从PC构建表中删除PartID。如果您有一个固定的零件目录,并且每个PC可以包含多个零件,并且每个零件可以在多个PC中使用,那么您需要一个额外的表(PC_至_零件),其中有一个PcID和一个PartID

是的,假设使用前一种方法,您可以使用以下查询找到每台电脑的成本

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

如果每个部件都属于某台电脑,那么您需要在部件表中添加一个PcID列,并从PC_Build表中删除PartID。如果您有一个固定的零件目录,并且每个PC可以包含多个零件,并且每个零件可以在多个PC中使用,那么您需要一个额外的表(PC_至_零件),其中有一个PcID和一个PartID

是的,假设使用前一种方法,您可以使用以下查询找到每台电脑的成本

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

你的意思是,如果我只是为每个部分创建了一个列,比如说,一个CPU列,给它一个部件ID,用于部件表中的一个CPU。这将破坏正常化。您的建议是使用第三个表,将PC_Build链接到PC_Build_零件到零件。我如何获得与PC构建相关的部件的成本,将其添加到PC的最终成本中,这只有在查询中才能实现?不,不要为每个部件创建一列。请参阅我的示例模式。您不一定需要BuildCost列,您可以通过查询来实现这一点-我已将其添加到答案中。感谢您的建议,我将尝试以下操作:)Rob描述了多对多关系,以及如何实现关联表来表示该关系。(我们称之为多对多关系,因为一个部件与多个pc_构建相关,而一个pc_构建与多个部件相关。那么你的意思是,如果我只为每个部件创建一列,那么让我们假设一个CPU列,并为它提供部件表中的一个CPU的部件ID。这将破坏规范化。你的建议是什么是否有第三个表将PC_Build链接到PC_Build_Part到Part。我如何获得与PC构建相关的Part的成本,将其添加到PC的最终成本中,这只能在查询中实现?不,不要为每个Part创建列。请参见我的示例架构。您不一定需要BuildCost列,您可以这样做通过一个查询-我已将其添加到答案中。感谢您的建议,我将尝试以下操作:)Rob描述了多对多关系,以及如何实现关联表来表示该关系。(我们称之为多对多关系,因为一个部件与多个pc_版本相关,而一个pc_版本与多个部件相关。您需要n:m关系。@Imre将此链接添加到我的答案中,因为它是好信息。您需要n:m关系。@Imre将此链接添加到我的答案中,因为它是好信息。谢谢:)我将尝试此链接,看看它是否有效!!在此模式中,一个部件只能属于一台PC,这并不一定是错误的,只是为了说明这一点。多个部件如何可能链接到一台PC。因为一台PC需要CPU、主板、电源、Ram等。。。我应该为每个人安排一张桌子吗