【问题标题】:database schema one column entry references many rows from another table数据库模式一个列条目引用另一个表中的许多行
【发布时间】:2015-01-16 17:02:52
【问题描述】:

假设我们有一个名为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 是110110

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

缺点 - 我不知道如何使用这种方法处理数量。此外,即使使用 64 位 BIGINT 仍然只能给我 64 个可以在我的表中的部分。我预计会有数百个。


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

【问题讨论】:

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


    【解决方案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 意味着“INTERSECTION”,换句话说:我要查找的数据应该存在于两个表中(通常是 id)

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

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

    workorderId |零件编号
    1 | 1
    1 | 2
    1 | 3

    【讨论】:

    • Workorders_Parts的PK是什么? (可能为了简洁而省略?)另外,这样可以轻松处理大量零件吗?
    • workorders_parts 不需要 PK,因为它是一个关系表。主键用于在含义上分隔元组。在这种情况下,您有 3 个元组,含义相同:“工作订单的一部分”,因此无需为其创建 PK
    • 可以在Workorders_Parts 中添加一个名为quantity 的列吗?
    • 是的,完全没问题。关系表接受仅在关系中有意义而不在单个部分中有意义的额外列。在这种情况下,数量仅在“工作订单有 2 个引擎”的关系中有意义.. 因此您可以为其创建列
    • 这样的 JOIN 维恩图 似乎 提供了丰富的信息,但仅用于在您已经了解什么是联接时说明内部联接和外部联接之间的区别。如果你为这个写一个键,那么你会发现必须理解这么多,只是为了解释这个图,它没有增加任何价值。提示:三个区域中的每一个区域都有哪些东西?该图更接近于具有相同列名和相应类型集的两个表的内部自然连接,或者对于由表在 id 上的投影产生的值。 (就像“INNER JOIN 的意思是“INTERSECTION”一样不清楚。)
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多