我有一个用于跟踪零件的小型数据库。对于此示例,该表如下所示:
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,这些零件已输入到上面输入的现有结构中。您可能最终得到的数据看起来像这样(此时忽略了不相关的原因字段):
PartID , SecondPartID 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')
我将进行更多测试,如果可以,我将反馈并接受答案。
我已经通过建立关系表解决了这个问题。
零件表:
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解决方案: