自然连接子集分解

时间:2014-08-08 10:37:09

标签: database join relational-database database-schema natural-join

对于这个问题,我发现答案是(c)。但我可举一个例子来证明(c)不正确。这是答案吗?

设r为模式R =(A,B,C,D)的关系实例。我们定义r1 = ‘select A,B,C from r'和r2 = ‘select A, D from r'。设s = r1 * r2其中*表示自然连接。鉴于r分解成r1和r2是有损的,下列哪一项是正确的?

(a)s是r
的子集 (b)r U s = r
(c)r是s
的子集 (d)r * s = s

如果答案是(c),请考虑以下示例,将r有损分解为r1和r2。

表r

A B C D

1 10 100 1000
 2 20 200 1000
 3 20 200 1001

表r1

A B C

1 10 100  2 20 200

表r2

A D

2 1000
 3 1001

表s(r1和r2的自然连接)

A B C D

2 20 200 1000

答案不是(c)。但我也可以给你一个例子,(c)可以作为答案。 应该是什么答案?

2 个答案:

答案 0 :(得分:2)

表r
A B C D

1 10 100 1000
1 20 200 2000

表r1
A B C

1 10 100
1 20 200

表r2
A D

1 1000
1 2000

表s(r1和r2的自然连接)
A B C D

1 10 100 1000
1 20 200 1000
1 10 100 2000
1 20 200 2000

分解被称为“有损”,因为我们已经失去了使用自然连接重新组合原始关系值的能力。当我们尝试自然连接时,这种丢失的能力表现为额外的行。发生这种情况的根本原因是分解在分解的两个表中都没有完全保留任何键({{B} {C} {D}})。如果原始的任何键完全保留在分解的所有组件中,则分解不会有损。

答案 1 :(得分:0)

表r是:

A B  C   D
1 10 100 1000
2 20 200 1000
3 20 200 1001

r1是:

r1 = ‘select A,B,C from r’ 

A B  C   
1 10 100 
2 20 200 
3 20 200 

r2是:

r2 = ‘select A, D from r'

A D
1 1000
2 1000
3 1001

s是:

s = r1 * r2

1 10 100 1000
2 20 200 1000
3 20 200 1001

因此r有效地作为s的子集。如果r1的定义是'从r中选择A,B,C',你就不能从结果中删除一行(如你的例子中所做的那样)并且说r1仍然符合定义,同样适用于r2删除第一行的位置。