Database 自然连接在联合之上是分配的吗?

Database 自然连接在联合之上是分配的吗?,database,join,relational-database,relational-algebra,natural-join,Database,Join,Relational Database,Relational Algebra,Natural Join,给定三个关系R、S和T,是真的吗: R⋈ (sut)=(R)⋈ S) U(R)⋈ (T) 如果是,我们能证明吗?是的 假设我们有3个关系R,S,T 首先,您应该知道S和T必须是并集兼容的,以便执行并集运算,这意味着两个关系具有相同的字段 证明左->右: 假设一个行r属于左运算集。然后,对于那些最初来自S或T的值,它们必须出现在与S或T的关系中。在不丧失一般性的情况下,假设它们来自S。然后,行r属于r⋈ 美国 验证右->左: 假设一个行r'属于右运算集。那么,r要么属于 R⋈ S或R⋈ T 在不丧

给定三个关系R、S和T,是真的吗:

R⋈ (sut)=(R)⋈ S) U(R)⋈ (T)

如果是,我们能证明吗?

是的

假设我们有3个关系R,S,T

首先,您应该知道S和T必须是并集兼容的,以便执行并集运算,这意味着两个关系具有相同的字段

证明左->右:

假设一个行r属于左运算集。然后,对于那些最初来自S或T的值,它们必须出现在与S或T的关系中。在不丧失一般性的情况下,假设它们来自S。然后,行r属于r⋈ 美国

验证右->左:

假设一个行r'属于右运算集。那么,r要么属于 R⋈ S或R⋈ T

在不丧失一般性的情况下,假设r属于r⋈ 然后,对于那些最初来自S的值,它也属于sut中的一行

因此,r'属于r⋈ (SUT)


因此,这个命题是正确的。

在集合语义下,如Tipton的回答所示,这是正确的,但在bag语义下,因为SQL使用的不是。考虑反例:

    > create table R(A TEXT);
    Query executed in 0 min. 0 sec 5 msec.
    > create table S(A TEXT);
    Query executed in 0 min. 0 sec 1 msec.
    > create table T(A TEXT);
    Query executed in 0 min. 0 sec 2 msec.
    > insert into R values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > insert into R values('a');
    Query executed in 0 min. 0 sec 0 msec.
    > insert into S values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > insert into T values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > select * from (select * from R JOIN (select * from S UNION select * from T) u ON R.A=u.A);
    a|a
    a|a
    --- [0|Column names ---
    [1|A [2|A:1 
    Query executed and displayed **2 rows** in 0 min. 0 sec 11 msec.
    > select * from R JOIN S ON R.A=S.A UNION select * from R JOIN T ON R.A=T.A;
    a|a
    --- [0|Column names ---
    [1|A [2|A 
    Query executed and displayed **1 row** in 0 min. 0 sec 20 msec.

当你给出等价性a=B的形式证明时,你实际上是在证明:如果a,那么B;如果B,那么A.left->right意味着如果一个元素属于左,那么它也属于右。