我正准备在我的学校进行即将到来的考试。
当我正在阅读一些示例问题时,我遇到了一个特定的问题。
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]
问题是:
考虑乘客在成田航班上占用的班级。 用关系代数写:有乘客的ids是什么? 这些课程中至少有一次从成田飞过?
到目前为止我所做的是:
-- 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)
第三季将向我展示(如果我已经正确完成)所有在不同班级旅行过不止一次的乘客。
有人可以帮助我从这一点进一步发展吗?
答案 0 :(得分: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
对于Q1,乘客 p_id 在类中的 d_no 上获取了 f_no (对于该航班号和日期) )在 class' 中。 (请注意,根据常识,一个人一次只能在一个班级中旅行,如果 class <> class' 那么他们必须在相同的日期,在不同的班级中,使用相同的航班号飞行多次旅行。)
Q1 - Q2
只是SELECT class <> class' Q1
。所以Q3持有乘客的ID,这些乘客在同一天使用相同的航班号以不同的班级旅行。但是这些人与你的整体查询的合理解释并不相关[&#34;在这些课程中至少一次从成田飞过的乘客&#34;
但无论如何,因为{f_no,f_date}是飞行的CK(候选钥匙),对于给定的航班号和日期,只有一个航班,所以没有乘客可以乘坐相同的航班号和航班号。约会不止一次。所以Q3无论如何都是空的。
根据英文说明
形成关系代数查询
始终表征关系 - 给定的一个或查询(子)表达式的值 - 通过语句模板 - 谓词 - 由属性参数化。这种关系使得元组成为一个声明 - 命题 - 这种情况也是如此。
您必须为每个基本关系提供谓词。例如:
-- (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-s
。 SELECT c r
的谓词是predicate-of-r AND c
。每个关系运算符都有这样的谓词变换。 PROJECT some-attributes-of-r r
的谓词是FOR SOME other-attributes-of-r predicate-of-r
。 RENAME a\a' r
的谓词为predicate-of-r
,a
替换为a'
。
要查询,找到一个与所需谓词等效的谓词,然后用相应的关系表达式替换它的部分。请参阅this。
约束&amp;查询强>
我们必须知道谓词才能查询。约束(包括FD,CK,PK和FK)在可能出现的每种情况/状态中都是真实的,用谓词表示。我们只需要在查询时知道约束是否只能根据基本谓词来表达查询的谓词,因为这些约束成立。例如,Trip&amp;航班但没有约束我们无法查询乘客在成田航空公司的航班上占用的班级,即元组中的班级:
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}暗示它是Flight的CK,那么这两个谓词意味着相同的事情(即每个元组和情境具有相同的真值)。
另一方面,既然我们可以在给定CK约束的情况下表达该查询,那么我们也 需要被告知{f_no,f_date}是从飞行到飞行的FK 。 FK说,如果某位乘客在某个班级的 f_date 上选择了 f_no ,那么 f_no 从某个来源飞到 f_date 到某个目的地,{f_no,f_date}是飞行的CK。所以乘客{f_no,f_date}是一个航班{f_no,f_date}。但是无论FK的第一个结合是否也成立,或者任何其他约束也成立,查询返回满足其谓词的元组。