编辑 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) 一个位置管理者定义他/她的位置能够提供的能力。这可能是一个明确的“是”,一个明确的“否”,或者位置管理器根本没有列出某个能力。
数据库型号:
我创建了以下根实体
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
任务:
任务是找出某个产品是否可以在某个地点生产,因此为该产品定义的所有功能都必须存在于该地点。为了回答这个问题,我情不自禁地
创建位置和 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
一个特定的产品/位置,看看我有什么,我没有什么能力。我还可以通过检查来提供一个快捷的总体是/否答案Status="N" OR Status is NULL
——如果是这样,则无法生产产品。
问题:
对于 MSSQL、MySQL、Oracle 等关系数据库(尚未决定且超出我的影响),我想知道我是否为这种 M:N 关系选择了正确的数据模型,或者我是否可以做得更好。特别是我担心ca。250 个位置、150 种产品和一种产品平均由 +/- 10 项功能定义,也就是说,375.000 行的笛卡尔乘积,由于巨大的内存消耗,性能将崩溃。
我也很想避免存储过程。
任何想法都会受到欢迎。