1

バージョン管理されたデータの情報を簡単に比較するための優れたデータベース設計ソリューションを探しています。たとえば、以下のシナリオを確認してください (ただし、実際のシナリオをアプリケーションに配置することはできません。申し訳ありません)。

サンプルデータ:

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 の関係が簡単に利用できるため、簡単に比較できます。しかし、V002 から作成された V005 の場合、そして誰かが V004 と V001 を比較したい場合、それは少し難しくなります。

PS パーツ名のみを比較する必要があるため、パーツのマスター テーブルを作成できません。

バージョン管理の頻度が非常に高く、親>>親>>親の関係が階層内で非常に深くなる可能性がある場合、誰でも別のデータベース設計または簡単な解決策を提案できますか?

たとえば、V001 と V002 の出力を比較しています。

V001 パート 1 2 V002 パート 1 2

V001 パート 2 1 V002 パート 2 1

V001 Part3 2 V002 NULL 0

V001 NULL 0 V002 Part4 2

上記のように、任意のバージョンを互いに比較して違いを見つけることができるはずです。

4

1 に答える 1

0

そのようなものに使用する2つの基本的なアプローチがあります...

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

2 番目の方が長くなりますが、結合を行う必要がないため、特定の状況ではより高速になる可能性があります。

于 2012-07-02T15:14:59.877 に答える