数据库模式一列条目引用了另一列的多行 table

database schema one column entry references many rows from another table

假设我们有一个名为 Workorders 的 table 和另一个名为 Parts 的 table。我想在 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:2-3:4-5:5-4'的字符串。我的应用程序将解析此字符串并显示我需要 --> 1 engine、3 belts、5 little bolts 和 4 quarts of oil

优点 - 足够简单,易于创建和理解。

缺点 - 将使深入反省我们的数据变得更加困难。 (时间成本等)


思路2:使用二进制数。例如,使用 8 位整数引用上面的列表 (enginebeltlittle boltsoil) 将是 54,因为 54 在二进制表示中是 110110

优点 - 数据类型在大小方面是最佳的。另外,我猜我可以在查询中使用一些棘手的数学技巧来搜索使用过的部件(不知道那些是什么,如果我在云中,请纠正我)。

缺点 - 我不知道如何使用此方法处理数量。此外,即使使用 64 位 BIGINT,我的 table 中仍然只能提供 64 个部分。我预计会有数百个。


有什么想法吗?我正在使用 MySQL。我也许可以使用 PostgreSQL,而且我知道它们有更灵活的 datatypes,例如 JSON 和数组,但我不熟悉查询它们的执行方式。此外,留在 MySQL

会容易得多

为什么不建立关系 table?

您可以创建一个名为 Workorders_Parts 的 table,内容如下:

|workorderId, partId|

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

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

查询内容是:

Give me the name of parts that belongs to workorderId=x and are listed in table workorders_parts

记住 INNER JOIN 意味着 "INTERSECTION" 换句话说:我要查找的数据(通常是 ID)应该存在于 tables

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

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

工单编号 |零件编号
1 | 1
1 | 2
1 | 3