用于计算行数的关系代数

时间:2013-09-11 23:16:02

标签: relational-database relational-algebra

我不确定该怎么称呼这个问题,但它并不完全是在计算行数。假设我们有关系:

Competition(compId, sport, playerName, medal)

让我们说属性奖章可以是金牌,银牌,铜牌或空牌。所以我们有以下数据:

(193, Tennis, John Doe, Gold)
(931, Skiing, Mary White, Bronze)
(193, Tennis, Arnold Black, null)
(182, Bobsledding, John Doe, Gold)
(901, Ping-Pong, Adam Brown, Silver)
(248, Bobsledding, Mary White, Silver)

我很难弄清楚如何回答这个问题:获取所有赢得一枚以上奖牌的球员的名字。在这些数据中,答案将是John Doe和Mary White。如何使用关系代数得到关于此关系的任意数据的答案?

(这是实际作业问题的简化版本,这种简化代表(我希望)我正在努力解决的问题的一部分。有一些任意和未知数量的比赛,体育和球员,但只有4种可能的奖牌)

3 个答案:

答案 0 :(得分:1)

  

获取赢得多枚奖牌的所有玩家的名字。

(目前尚不清楚这意味着什么。赢得了多种奖牌?还是获得了不止一枚奖牌?你的例子答案暗示了后者。另外,它将“null”视为另一种奖牌,而不是特别的就像在SQL中一样。)

-- rows where
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
        in competition [compId] of sport [sport] player [playerName] won [medal]
    AND in competition [compId2] of sport [sport2] player [playerName] won [medal2]
    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)

使用语句简写:

-- rows where
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
        Competition(compId, sport, playerName, medal)
    AND Competition(compId2, sport2, playerName, medal2)
    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)

重新排列(预测每σ一个比较的限制和每个set一个属性集):

-- rows where
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
        (   Competition(compId, sport, playerName, medal)
        AND Competition(compId2, sport2, playerName, medal2)
        AND compId <> compId2)
    OR (   Competition(compId, sport, playerName, medal)
        AND Competition(compId2, sport2, playerName, medal2)
        AND sport <> sport2)
    OR (   Competition(compId, sport, playerName, medal)
        AND Competition(compId2, sport2, playerName, medal2)
        AND medal <> medal2)

现在取代数:

  • 其表/关系的每个陈述
  • 表/关系的每个AND由⋈(自然连接)
  • 表/关系的每个OR(必须具有相同的列/属性)由∪(union)
  • 每个AND NOT(必须具有相同的列/属性)\(差异)
  • 每次AND 比较按σ比较(选择/限制)
  • 每个EXISTS 名称将删除π名称以保持(投影)
  • 每个列/属性重命名为ρ(重命名)。

    π playerName (
        σ compId <> compId2 (Competition
            ⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
    ∪   σ sport <> sport2 (Competition
            ⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
    ∪   σ medal <> medal2 (Competition
            ⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
    )
    

(有关详情,请参阅this answer。)

答案 1 :(得分:0)

在我看来,有一种更简单的方法来解决这个问题:

enter image description here

基本上,您可以找到奖牌的关系,其中奖牌不是空的,然后将此记录与自身连接,加入名称。结果记录将是名称重复的记录。

答案 2 :(得分:0)

我知道这是一篇非常古老的文章,但是我正在学习该主题,并且确实找到了另一种表达练习要求的方法。也许对搜索此内容的人可能有用。

答案:

π Lc.playerName (
    ρ Lc σ medal ≠ 'null' Competition
            ⨝ Lc.playerName = Rc.playerName AND Lc.sport ≠ Rc.sport
    ρ Rc σ medal ≠ 'null' Competition)

我假设在同一项运动中没有人能获得两枚奖牌,如果某人获得的奖牌不止一个,那么它就必须从事不同的运动。我还假设关系中的每个元组都代表一个奖励,所以...

上面的表达式设法使播放器名称针对不同的运动出现多次。


已编辑:我将其视为空值... 您可以使用此工具https://dbis-uibk.github.io/relax/calc.htm

看到它的实际效果

要设置数据,请在“组编辑器”标签中使用此代码

group:Competition

Competition = {
    compId:number, sport:string , playerName:string, medal:string
    193          , 'Tennis'     , 'John Doe'       , 'Gold'      
    931          , 'Skiing'     , 'Mary White'     , 'Bronze'    
    193          , 'Tennis'     , 'Arnold Black'   , 'null'      
    182          , 'Bobsledding', 'John Doe'       , 'Gold'      
    901          , 'Ping-Pong'  , 'Adam Brown'     , 'Silver'    
    248          , 'Bobsledding', 'Mary White'     , 'Silver'    
}