数据库模式一列条目引用了另一列的多行 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 位整数引用上面的列表 (engine
、belt
、little bolts
、oil
) 将是 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
假设我们有一个名为 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 位整数引用上面的列表 (engine
、belt
、little bolts
、oil
) 将是 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