PROJECT A(r − s) と PROJECT A(r) − PROJECT A(s) は RDBMS で表現がどう違うのか混乱しています。上記を証明する例を誰かが示すことができますか?
2 に答える
r = { TUPLE {X 1 , Y 1} }
s = { TUPLE {X 1 , Y 2} }
r MINUS s = r = { TUPLE {X 1 , Y 1} }
Take projections over X (A = {X} ???)
r PROJECT {X} === { TUPLE {X 1} }
s PROJECT {X} === { TUPLE {X 1} }
(r PROJECT {X}) MINUS (s PROJECT {X}) === { }
(r MINUS s) PROJECT {X} === { TUPLE {X 1} }
sのY2部分です。これが、rとsのタプルの違いです。最初に「その差を投影」すると、その後に残っているものはすべて等しくなり、等しいもの間の差を計算することはもちろんまったく何もありません。
ただし、最初に差を計算すると、sのタプルのY 2部分により、rのタプル(だらしなく言えば)が結果から破棄されなくなり、その結果を予測すると、当然、空ではないものが生成されます。
s = [x y]
0 0
1 1
2 2
r = [x y]
0 0
0 1
0 2
1 1
1 2
2 2
A = {y}
PROJECT A(r − s)=[y]
1
2
PROJECT A(r) − PROJECT A(s)=[y]
このような(反)例を生成する方法は次のとおりです。OP の問題はQBQLアサーションに変換されます。
a <AND> TABLE_DUM = a & r <AND> TABLE_DUM =s <AND> TABLE_DUM
->
a v ( r <AND> <NOT> s ) = (a v r) <AND> <NOT> (a v s).
(一般化された射影)を除くすべての演算"v"
は D&D 代数 A からのものです。最初の 2 つの含意条件は、関係a
が空であること、および関係r
とs
が同じヘッダーを持つことを必要とします。以下を出力します。
s = [p]
0
;
r = [p]
1
;
a = [r]
;
*** False Assertion ***
これは正当な答えですが、ヘッダーに属さない属性に関係を射影するという考えに不快に感じる人もいるかもしれません。a
およびr
ヘッダーをオーバーラップさせるには、もう 1 つの条件を追加する必要があります(a v s) <AND> TABLE_DUM != TABLE_DUM
。次に、属性 {p,r} を手動で OP の {x,y} に変換する必要があります。(Erwin が気付いたバグが導入された場所です)。