【问题标题】:Forming a relational algebra query from an English description从英文描述形成关系代数查询
【发布时间】:2017-04-09 09:18:58
【问题描述】:

我正在为学校即将举行的考试做准备。

在处理一些示例问题时,我遇到了一个特定问题。

Passenger {p_id, p_name, p_nation} with key {p_id}
Flight {f_no, f_date, f_orig, f_dest} with key {f_no, f_date}
Trip {p_id, f_no, f_date, class} with key {p_id, f_no,f date}  
    and foreign keys [p_id] ⊆ Passenger[p_id] and [f_no, f_date] ⊆ Flight[f_no, f_date]

问题问:

考虑乘客在从成田机场起飞的航班上所乘坐的舱位。 用关系代数写:有哪些乘客的 id 从成田机场乘坐这些班至少一次?

到目前为止我所做的是:

-- rename class to class' in Trip and join with Trip
Q1 = Trip JOIN RENAME class\class' (Trip)
-- select those Q1 tuples where class = class'
Q2 = RESTRICT class = class' (Q2)
-- Project for those who traveled in different classes more than once
Q3 = PROJECT p_id (Q1 - Q2)



Q3 将向我显示(如果我做得正确的话)多次乘坐不同舱位的乘客的所有 ID。

有人可以帮助我进一步了解这一点吗?

【问题讨论】:

  • 谷歌 'unicode 关系投影' 等以获取您需要的字符作为文本。 Aso 'unicode 数学符号'。
  • 您对 Q1 的表述没有意义。 JOIN 的右操作数没有提到重命名发生的关系。另外,有很多关系代数变体,所以请参考你的。 (到目前为止,我们只知道您使用过的运算符。) PS 请参阅 [this](stackoverflow.com/a/41800639/3404097].
  • 您的 Q3 评论“那些曾多次乘坐不同等级[es] 的人”不清楚。后来您说 Q3 是“多次乘坐不同舱位的乘客”,但这也不清楚。请编辑以实际描述您想要的元组。 (如果你不能用自然语言说清楚,你怎么能希望用代数说清楚呢?)你为什么认为你的 Q3 代码给出了这些 id? PS 我尽我所能编辑了你的语言和格式。请注意,我将(Trip) 添加到您的代码的文本版本中。

标签: relational-algebra


【解决方案1】:

这是我所知道的。

您计算的 Q3 实际上包含同一天同一航班号乘坐多个舱位的乘客。此外,根据限制,没有这样的乘客。原因如下:

根据你的代码 Q1 是

/* (tuples where)
    p_id took f_no on f_date in class
AND p_id took f_no on f_date in class'
*/
Trip JOIN RENAME class\class' Trip

对于第一季度,乘客 p_idd_noclass 上乘坐 f_no 并且(对于该航班号和日期) 在类'中。 (请注意,根据常识,一个人一次只能乘坐一个舱位的航班,如果 class class' 那么他们一定乘坐过多次航班同一天同一航班号,不同舱位。)

Q1 - Q2 就是 SELECT class <> class' Q1。因此,Q3 保存了在同一日期使用相同航班号乘坐不同舱位的乘客的 ID。但这些人与对您的整体查询“从成田机场起飞的乘客至少参加过一次这些舱位”的整体问题的合理解释无关。

但无论如何,由于 {f_no, f_date} 是航班的 CK(候选键),对于给定的航班号和日期,只有一个航班,因此没有乘客可以多次乘坐相同的航班号和日期。所以第三季度还是空的。

根据英文描述形成关系代数查询

始终通过语句模板来表征关系——给定关系或查询(子)表达式的值——谓词——由属性参数化。该关系包含使其成为陈述的元组--命题--对于这种情况是正确的。

您必须已获得每个基本关系的谓词。例如:

-- (tuples where) p_id took f_no on f_date in class
Trip

然后您需要根据基本谓词来表达您的查询(子)表达式谓词,以便可以根据基本关系计算(子)表达式关系:

考虑乘客在成田机场乘坐的航班的舱位。

/* (tuples where)
FOR SOME p_id, f_no, f_date, f_orig & f_dest,
        p_id took f_no on f_date in class
    AND f_no flew on f_date from f_orig to f_dest
    AND f_orig = 'Narita'
*/
PROJECT class SELECT f_dest = 'Narita' (Trip JOIN Flight)

r JOIN s 的谓词是predicate-of-r AND predicate-of-sSELECT c r 的谓词是predicate-of-r AND c。每个关系运算符都有这样的谓词转换。 PROJECT some-attributes-of-r r 的谓词是FOR SOME other-attributes-of-r predicate-of-rRENAME a\a' r 的谓词是 predicate-of-r,其中(适当出现的)a 替换为 a'

要查询,找到一些与你想要的谓词等价的谓词,然后用对应的关系表达式替换它的部分。见this

约束和查询

我们必须知道谓词才能查询。约束(包括 FD、CK、PK 和 FK)是可能出现的每种情况/状态中的真理,用谓词表示。我们只需要在查询时知道约束条件,如果查询的谓词只能用基本谓词来表达,因为这些约束条件成立。例如,给定 Trip & Flight 但没有约束我们无法查询“乘客在成田机场起飞的航班上的舱位”,即元组中的类别,其中:

p_id took f_no on f_date in class from f_orig to f_dest

我们能得到的最接近的是 (Trip JOIN Flight):

    p_id took f_no on f_date in class
AND f_no flew on f_date from f_orig to f_dest

但这并不一定能告诉我们在哪些航班上使用了哪些舱位。但是如果 {f_no, f_date} 在 Flight 中是唯一的,这意味着 {f_no, f_date} 是 Fl​​ight 的 CK,那么这两个谓词意味着相同的事情(即对于每个元组和情况具有相同的真值)。

另一方面,由于我们可以在给定 CK 约束的情况下表达该查询,因此我们不需要被告知 {f_no, f_date} 是从 Trip 到 Flight 的 FK。 FK 说,如果某个乘客在 f_date 乘坐 f_no 在某个舱位,那么 f_no 会在 f_date 从某个来源起飞到某个目的地,{f_no, f_date} 是飞行的 CK。所以乘客 {f_no, f_date} 是航班 {f_no, f_date}。但是无论 FK 的第一个合取是否也成立,或者任何其他约束也成立,查询返回满足其谓词的元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多