多个主键作为单个外键

时间:2011-04-18 19:35:52

标签: database-design foreign-keys

我需要设计2个或更多表。 1. SubParts表 2. MainParts表。

单个MainPart可以有多个子部件。我正在考虑做像

这样的事情

SubPart表: 身份证和姓名

MainPart表格: 身份证和姓名

SubPart_MainPart关系表: MainPart_ID SubPart_Ids(数组或逗号分隔)

有没有办法将多个subpart_id放在关系表的单列中? 或者我应该将MainPart_D和SUbPart_ID用作关系id中的组合主键吗?

第二种方法会增加关系表中的大量记录。 当我尝试迭代逗号分隔列(SubPart_Ids)时,第一种方法将增加循环代码。

你还有其他方法吗?

感谢您的帮助

4 个答案:

答案 0 :(得分:0)

拥有子部件ID列表将违反1NF,并且几乎在任何情况下都非常不鼓励。如果您正在使用任何类型的DBMS,那么在交集表中包含更多行不是问题。

要考虑的另一件事是为什么你有一个单独的子部件表。做这种事情的传统方式(所谓的“物料清单”)是有一个表用于零件/组件,一个表用于表示“这些是构成该东西的东西”。换句话说:

ASSEMBLY
- Assembly ID (PK)
- Assembly Name 

COMPOSITION
- Contained In Assembly ID  (PK, FK)
- Contains Assembly ID (PK, FK)

编辑:请注意,真实的物料清单会在COMPOSITION表中包含数量和计量单位(数量)的字段。

答案 1 :(得分:0)

数据库设计的Fisrt规则,不要将任何内容存储在数组或逗号分隔列表中。您想要一个具有mainpart id和子部分id的连接表以及每个子部分的一条记录。如果正确编制索引,查询会更容易,也可能更快。

答案 2 :(得分:0)

您可能只需要两张桌子:

MainPartTable
   *ID
   Name 

SubPartTable
   *MainPartTable_ID
   *SubPartTable_ID
   Name

答案 3 :(得分:0)

SubPart是否有一个或多个mainParts?

如果只有一个MainPart,那么您只需要SubPart和MainPart表;其中包含SubPart表中的MainPart ID。

如果有多个MainParts,则需要一个SubPart_MainPart表。这不应该是逗号分隔列表。每一行应该是MainPart和SubPart之间的一个链接。