一尘不染

SQL查询中的双向关系

sql

我有一个用于跟踪零件的小型数据库。对于此示例,该表如下所示:

PartID (PK),int
PartNumber ,Varchar(50),唯一
描述 ,Varchar(255)

我需要定义某些部分被归为彼此相似。为此,我设置了第二个表,如下所示:

PartID ,(PK),int
SecondPartID ,(PK),int
ReasonForSimilarity ,Varchar(255)

然后,在两个表之间建立了多对多关系。

当我需要对被认为是类似的,因为关系是双向的IE,如果部分零件报告,问题就来 XYZ123 类似于 ABC678 然后 ABC678 被认为是类似
XYZ123
。因此,如果我想列出与给定零件相似的所有零件,我要么需要确保在两个方向上都建立了关系(这很不好,因为数据是重复的),或者需要有两个查询才能在两个方向上查看表。这些解决方案都不适合我。

那么,该如何解决呢?可以仅使用SQL来解决此问题,还是需要更改设计以满足业务需求?

考虑以下零件XYZ123,ABC123,ABC234,ABC345,ABC456和EFG456,这些零件已输入到上面输入的现有结构中。您可能最终得到的数据看起来像这样(此时忽略了不相关的原因字段):

PartIDSecondPartID
XYZ123,ABC123
XYZ123,ABC234
XYZ123,ABC345
XYZ123,ABC456
EFG456,XYZ123

我的用户想知道 “哪些零件与XYZ123相似” 。可以使用如下查询来完成:

SELECT SecondPartID
FROM tblRelatedParts
WHERE PartID = 'XYZ123'

但是,这样做的问题是,尽管零件已经以相反的方式进入,但它不会挑选与XYZ123相关的零件EFG456。可能会发生这种情况,具体取决于用户当前正在使用哪个部件,并且部件之间的关系
始终 是双向的。

我遇到的问题是,我现在需要检查的是,当用户在两个部分之间建立关系时,该关系在另一个方向上还不存在。

@戈兰

我已经根据您的建议进行了一些初步测试,这就是我计划使用您的建议解决问题的方式。

上面列出的数据输入到新表中(请注意,我已将partID更改为零件号,以使示例更清楚;尽管如此,我的问题的语义并未更改)

该表将如下所示:

RelationshipID部分号码
1,XYZ123
1,ABC123
2,XYZ123
2,ABC234
3,XYZ123
3,ABC345
4,XYZ123
4,ABC456
5,EFG456
5,XYZ123

然后,我可以使用类似这样的查询来检索相似零件的列表:

SELECT PartNumber
FROM tblPartRelationships
WHERE RelationshipID ANY (SELECT RelationshipID
                          FROM tblPartRelationships
                          WHERE PartNumber = 'XYZ123')

我将进行更多测试,如果可以,我将反馈并接受答案。


阅读 172

收藏
2021-05-16

共1个答案

一尘不染

我已经通过建立关系表解决了这个问题。

零件表:

PartID (PK),整数

零件编号 ,Varchar(50),唯一

Description ,Varchar(255)

PartRelationship表:

RelationshipId (FK),整数

PartID (FK),整数

关系表:

RelationshipId (PK),整数

现在,将相似的部分简单地添加到“关系”表中:

RelationshipId,PartId

1,1

1,2

每当添加关系ID = 1的另一个零件时,都将其视为与关系ID = 1的任何零件相似。

用于添加关系的可能的API解决方案:

  • 为每个相似零件列表创建新的关系。让客户端在需要时加载,更改和更新整个列表。
  • 检索相似对象的关系。通过某些条件过滤列表,以便仅保留一个条件或让客户从现有关系中进行选择。根据需要创建,删除PartRelationship记录。
  • 从“关系”表中检索关系列表。让客户指定零件和关系。根据需要创建,删除PartRelationship记录。
2021-05-16