2013 年 4 月 10 日編集
自分自身を明確にするために、私が達成しようとしていることの原則を示す別の (簡略化された) 例を追加しています。
T1 - PERSONHAS T2 - PRODUCTNEED
ANTON has WHEEL CAR need ENGINE
ANTON has ENGINE CAR need WHEEL
ANTON has NEEDLE SHIRT need NEEDLE
BERTA has NEEDLE SHIRT need THREAD
BERTA has THREAD JAM need FRUIT
BERTA has ENGINE JAM need SUGAR
Q3 - PERSONCANMAKE
ANTON canmake CAR
BERTA canmake SHIRT
Q4 - PERSONCANNOTMAKE
ANTON cannotmake SHIRT
ANTON cannotmake FRUIT
BERTA cannotmake CAR
BERTA cannotmake FRUIT
T1 と T2 があり、Q3 と Q4 のクエリを作成したい
編集終了 2013 年 4 月 10 日
序文:
製品 (P) を作成するには、特定の一般的な機能 (C - 工場、供給、電気、水など) が必要です。製品マネージャーは、製品を作成するために必要なすべての一般的な機能を定義します。
あるロケーション (L) には特定の一般的な機能があります (C) ロケーション マネージャーは、そのロケーションが提供できる機能を定義します。これは、明確な YES、明確な NO のいずれかである場合もあれば、ロケーション マネージャーが特定の機能をまったくリストしていない場合もあります。
DB モデル:
次のルートエンティティを作成しました
Location (PK: L) - values L1, L2, L3 // in real ca. 250 rows of L
Product (PK: P) - values P1, P2 // in real ca. 150 rows of P
Capability (PK: C) - values C1, C2, C3 // in real ca. 80 rows of C
および次の子 (依存) エンティティ
ProductCapabilityAssignment:P, C (PK: P, C, FK: P, C)
P1 C1
P1 C2
P2 C1
P2 C3
LocationCapabilityAssignment: L, C, Status (Y/N) (PK: L, C, FK: L, C)
L1 C1 Y
L2 C1 Y
L2 C2 Y
L2 C3 N
L3 C1 Y
L3 C2 Y
L3 C3 Y
仕事:
タスクは、特定の製品を特定の場所で生産できるかどうかを調べることです。これにより、製品に対して定義されたすべての機能がその場所に存在する必要があります。これに答えるために、私は自分自身を助けることができませんでした
Location と ProductCapabilityAssignment のデカルト積 (CL_Cart) を作成して、ロケーションごとに、可能なすべての製品とその cpability のニーズをリストするようにします。
CREATE VIEW CL_Cart AS
SELECT L.L, PCA.P, PCA.C
FROM Location AS L, ProductCapabilityAssignment AS PCA;
CL_Cart と LocationCapabilityAssignment の間に外部結合を作成して、場所が提供できるすべての機能を一致させます
CREATE VIEW Can_Produce AS
SELECT X.L, X.P, X.C, LCA.Status
FROM CL_CArt AS X LEFT JOIN LocationCapabilityAssignment AS LCA ON (X.C = LCA.C) AND (X.L = LCA.L);
最終的に私が得るように
SELECT L, P, C, Status
FROM Can_Produce;
L1 P1 C1 Y
L1 P1 C2 NULL // C2 not listed for L1
L1 P2 C1 Y
L1 P2 C3 NULL // C3 not listed for L1
L2 P1 C1 Y
L2 P1 C2 Y
L2 P2 C1 Y
L2 P2 C3 N // C3 listed as "No" for L2
L3 P1 C1 Y
L3 P1 C2 Y
L3 P2 C1 Y
L3 P2 C3 Y
つまり、L1 は P1 も P2 も生成できず、L2 は P1 を生成でき、L3 は P1 と P2 の両方を生成できます。
そのため、特定の製品/場所を照会Can_Produce
して、能力に関して持っているものと持っていないものを確認できます。また、全体的な YES/NO を調べることで、ショートカットを提供することもできますStatus="N" OR Status is NULL
。その場合、製品は製造できません。
質問:
MSSQL、MySQL、Oracle などのリレーショナル データベース (まだ決定しておらず、私の影響力を超えています) の場合、この M:N 関係に対して正しいデータ モデルを選択したのか、それとももっとうまくやれるのか疑問に思っています。特に私はそれを恐れています。250 の場所、150 の製品、および平均で 1 つの製品は、+/- 10 の機能によって定義されます。つまり、375.000 行のデカルト積では、膨大なメモリ消費のためにパフォーマンスが低下します。
また、ストアド プロシージャは避けたいと思います。
どんな考えでも大歓迎です。