table q2 的关系代数自然连接,重命名为 table q2 for Passenger-Flight-Trip

Relational algebra natural join of table q2 with rename of table q2 for Passenger-Flight-Trip

我从教程中得到的问题是:

Write in relational algebra: what is id of passengers who have flown First class from Narita more than once?

给我们的答案是:

q1 = σ class=First (Trip) ⋈ σ forig=Narita (Flight)
q2 = π fno,fdate,pid (q1)
q3 = q2 ⋈ δ fno→fno',fdate→fdate' (q2)
q4 = q3 - σ fno=fno' (σ fdate=fdate' (q3))
q5 = π pid (q4)

我不太确定 q3 如何完成任何事情...我看不出重命名属性并将它们加入原始属性会有什么帮助,因为你最终会得到 table 之类的

fno' | fno  | fdate | fdate' | pid

并且 fno' 的所有值将等于 fno 的所有值和 fdate 的相同值,因为您自然地连接两个相同的 table。 (它将加入 pid,并且由于所有值都相等,你不会在 q4 中得到空集吗?)

q3 是如何工作的?

you would just end up with a table like

fno' | fno | fdate | fdate' | pid

and all values of fno' will equal all values of fno and same thing for fdate as you are natural joining two of the same table.

不,并不是每一行中的 fno = fno' 和 fdate = fdate',因为它们是四个不同的列名和自然连接 returns 联合左行的所有行组合和右行,其中同名列具有相同的值。

(It will join on pid and since all values [of fno & fno' in a row] are equal wouldn't you just end up with empty set in q4?)

如上所述,它们并不完全相同。

根据 table 值 联接包含 (fno,fdate,pid) 在 q2 中的行 AND (fno',fdate',pid)正在重命名。这些行是您从共享相同 pid 的 q2 (fno, fdate) 和重命名 (fno', fdate') 的每个组合中获得的。

在 table 含义方面 在数据库中,table(基础或查询)包含使 为真的行proposition(语句)来自某些由其列参数化的 predicate(语句模板)。例如,Trip 包含“pidfdatefnoclass";在 shorthand 中,Trip(pid, fno, fdate, class) 所在的行。如果 q2 包含 q2(fno,fdate,pid) 所在的行,则 δ(重命名)的性质是 δ fno→fno',fdate→fdate'(q2) 包含 q2(fno',fdate',pid) 所在的行,⋈(自然join) 是 q2 的自然连接 & 重命名包含 q2(fno,fdate,pid) AND q2(fno',fdate',pid).


(每个运算符将输入谓词转换为输出谓词的事实就是我们 :

Flight -- fno flew on fdate from forig to fdest
Trip -- pid took fno on fdate in class
σ class=First (Trip) -- pid took fno on fdate in class AND class=First
σ forig=Narita (Flight) -- fno flew on fdate from forig to fdest AND forig=Narita
q1 -- pid took fno on fdate in class AND class=First
    AND fno flew on fdate from forig to fdest AND forig=Narita
q2 -- FOR SOME class,forig & fdest,
            pid took fno on fdate in class AND class=First
        AND fno flew on fdate from forig to fdest AND forig=Narita
q3 --   FOR SOME class,forig & fdest,
                pid took fno on fdate in class AND class=First
            AND fno flew on fdate from forig to fdest AND forig=Narita
    AND FOR SOME class,forig & fdest,
                pid took fno' on fdate' in class AND class=First
            AND fno' flew on fdate' from forig to fdest AND forig=Narita

即:

q3 --   FOR SOME fdest,
                pid took fno on fdate in First
            AND fno flew on fdate from Narita to fdest
    AND FOR SOME fdest,
                pid took fno' on fdate' in First
            AND fno' flew on fdate' from Narita to fdest

)

q3 加入 q2 自身,但只能通过 pid 属性。

q4 然后从 q3 中删除那些元组,这些元组正是从 q2 中的元组生成的,这些元组在 q3.

这两个操作的综合效果是回答问题的 "more than once" 部分 - 因为它设法为乘客生成至少 航班.