-1

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

设 r 是模式 R = (A, B, C, D) 的关系实例。我们定义r1 = ‘select A,B,C from r'和r2 = ‘select A, D from r'。让s = r1 * r2where * 表示自然连接。鉴于将 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

美国广播公司

1 10 100 2 20 200

表 r2

广告

2 1000
3 1001

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

A B C D

2 20 200 1000

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

4

2 回答 2

2

表 r
ABCD

1 10 100 1000
1 20 200 2000

表 r1
ABC

1 10 100
1 20 200

表 r2
AD

1 1000
1 2000

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

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

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

于 2014-08-13T13:48:45.963 回答
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删除第一行的位置。

于 2014-08-09T17:49:19.923 回答