【问题标题】:Natural join subset decomposition自然连接子集分解
【发布时间】:2014-08-08 10:37:09
【问题描述】:

对于这个问题,我发现答案是 (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)可以是一个答案。 答案应该是什么?

【问题讨论】:

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


【解决方案1】:

表 r
A B C D

1 10 100 1000
1 20 200 2000

表 r1
甲乙丙

1 10 100
1 20 200

表 r2
一个D

11000
1 2000

表(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} } )。如果原始的任何密钥完全保留在分解的所有组件中,则分解不是有损的。

【讨论】:

    【解决方案2】:

    表 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删除第一行的位置。

    【讨论】:

    • 是的,但这是不同的问题,请参阅我已经提到“r 分解为 r1 和 r2 是有损的”,因此可能会发生丢失。
    • @MehulJain 是有损的,因为作为查询的结果,您没有获取所有列的值,有损并不意味着从结果中删除一行。
    • 好吧,我知道了一点,但是很抱歉,我并没有真正理解“有损”的概念。你能解释一下为什么你给出的例子是有损的吗??
    • @MehulJain 因为 r1 和 r2 上的查询结果不会带回您“丢失”一些信息的行上的所有数据。如果原始数据包含列 ABCD 并且结果是 AD 则您没有 BC,这是有损的,不是因为您丢失了数据,而是因为它不在查询结果中。
    • @MehulJain 如果我回答了你的问题,你应该将其标记为正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2018-11-30
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多