我正在寻找一个好的数据库设计解决方案,以便轻松比较我的版本化数据信息。请查看下面的我的场景(例如,我不能将实际场景放在我们的应用程序中 - 非常抱歉。)
Assembly
-----------
AssemblyId AssemblyId
--------------------------
1 Assembly1
2 Assembly2
BOM
--------------------------
BOMId AssemblyId VersionName ParentBOMId
-----------------------------------------------------
1 1 V001 NULL
2 1 V002 1
3 1 V003 2
4 1 V004 3
5 1 V005 2
[每次更改BOM记录时,都会从以前的任何版本继承(ParentBOMID) - 如果它是程序集的第一个版本,则ParentBOMID为Null]
BOMDetail
-----------
ID BOMID PartName Qty
---------------------------------------------------
1 1 Part1 2
2 1 Part2 1
3 1 Part3 2
4 2 Part1 2
5 2 Part2 1
6 2 Part4 2 {Change in PartName here in V002 Base Version V001}
7 3 Part1 2
8 3 Part2 1
9 3 Part4 2
10 3 Part5 9 {Added this part into V003 Base Version V002}
11 4 Part1 2
12 4 Part2 1
13 4 Part4 2
14 4 Part6 9 {this part changed into V004 Base Version V003}
15 5 Part1 2
16 5 Part2 1
17 5 Part9 2 {Change in PartName here in V002 Base Version V002}
我需要将不同的BOM版本相互比较。如果需要将V001与V002或V004与V003进行比较,则很容易,因为可以轻松获得ParentBOMId关系。但是对于V005,它是从V002创建的,如果有人想要将V004与V001进行比较,那就不难了。
P.S。我不能创建一个主要的零件表,我必须使用它来比较部分名称。
当版本控制频率非常高并且父级>>时,任何人都可以建议我使用不同的数据库设计或简单解决方案吗?父>>父级关系可能在层次结构中非常深入。
例如我比较V001和V002输出应该是
V001 Part1 2 V002 Part1 2
V001 Part2 1 V002 Part2 1
V001 Part3 2 V002 NULL 0
V001 NULL 0 V002 Part4 2
我应该能够比较任何版本,并找到上述差异。
答案 0 :(得分:0)
我会使用两种基本方法...
SELECT
*
FROM
(SELECT * FROM BomDetail WHERE BomID = 1) AS bom1
FULL OUTER JOIN
(SELECT * FROM BomDetail WHERE BomID = 2) AS bom2
ON bom1.PartName = bom2.PartName
SELECT
PartName,
SUM(CASE WHEN BomID = 1 THEN qty ELSE 0 END) AS bom1qty,
SUM(CASE WHEN BomID = 2 THEN qty ELSE 0 END) AS bom2qty
FROM
BomDetail
WHERE
BomID IN (1,2)
GROUP BY
PartName
虽然第二个更长,但它也不需要进行连接,因此在某些情况下可以更快。