数据库模式一列条目引用另一个表中的许多行

时间:2015-01-16 17:02:53

标签: mysql database database-design relational-database database-schema

我们假设我们有一个名为Workorders的表和另一个名为Parts的表。我希望在Workorders中有一个名为parts_required的列。此列将包含一个项目,告诉我该工作订单所需的部分。理想情况下,这也包含数量,但如果需要,第二列可以包含数量信息。

Workorders看起来像

WorkorderID   date   parts_required
1             2/24      ?
2             2/25      ?
3             3/16      ?
4             4/20      ?
5             5/13      ?
6             5/14      ?
7             7/8       ?

Parts看起来像

PartID    name           cost
1         engine         100
2         belt           5
3         big bolt       1
4         little bolt    0.5
5         quart oil      8 
6         Band-aid       0.1

创意1 :创建一个类似'1-1:2-3:4-5:5-4'的字符串。我的应用程序将解析此字符串并显示我需要 - > 1 engine,3 belts,5 little bolts和4 quarts of oil

优点 - 足够简单,可以创建和理解。

缺点 - 将对我们的数据进行深入反省更加困难。 (成本随着时间的推移等)


创意2 :使用二进制数字。例如,使用8位整数引用上面的列表(enginebeltlittle boltsoil)将是54,因为二进制表示中的54是{ {1}}。

优点 - 数据类型最适合大小。此外,我猜我可以在我的查询中使用棘手的数学技巧来搜索所使用的部分(不知道那些是什么,如果我在这里的云中,请纠正我)。

缺点 - 我不知道如何使用此方法处理数量。此外,即使使用64位110110仍然只给我64个可以在我的表中的部分。我期待数百个。


有什么想法吗?我正在使用BIGINT。我可以使用MySQL,我知道他们有更PostgreSQL datatypes更像JSON和数组,但我不熟悉那些查询会如何执行。使用MySQL

也会更容易

1 个答案:

答案 0 :(得分:1)

为什么不创建关系表?

您可以使用以下内容创建名为Workorders_Parts的表:

| workorderId,partId |

因此,当您想要从特定工单中获取所有部件时,只需键入:

select p.name 
from parts p inner join workorders_parts wp on wp.partId = p.partId
where wp.workorderId = x;

查询的内容是:

  

告诉我属于workorderId = x的部件的名称,并列在表workorders_parts

记住INNER JOIN意味着“交叉”换句话说:我正在寻找的数据应该存在于两个表中(通常是id)

inner join image

IT将为您提供用于构建工作订单x的所有部件名称。

假设我们有workorderId = 1,partID = 1,2,3,它将在我们的关系表中表示为:

workorderId | PARTID
1 | 1
1 | 2
1 | 3个