2017-04-09 32 views
0

我正准备在我学校进行即将到来的考试。从英文说明中形成关系代数查询

虽然我正在通过一些示例问题,但我陷入了一个特定的问题。

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) 

enter image description here
enter image description here
enter image description here

Q3会告诉我(如果我做得正确的话)的乘客所有的IDS谁不同班级不止一次地旅行。

有人可以帮助我进一步从这一点?

+0

谷歌'unicode关系投影'等等,以获得您需要的字符作为文本。阿索'unicode数学符号'。 – philipxy

+0

你对Q1的表达没有任何意义。 JOIN的右操作数没有提及重命名发生的关系。此外,还有很多关于代数的变体,所以请给你一个参考。 (到目前为止,我们只知道你已经使用过的操作员)。PS请参阅[this](http://stackoverflow.com/a/41800639/3404097)。 – philipxy

+0

你的Q3评论“那些在不同班级[es]不止一次“是不清楚的,后来你说Q3是”不同班级乘客不止一次出行“的乘客,但这并不明确,请编辑实际描述你想要的元组(如果你不能清晰的自然语言,你希望在代数中清楚吗?)为什么你认为你的Q3代码给出了这些ID?PS我尽我所能地编辑了你的语言和格式,注意我添加了(Trip)到您的代码的文本版本。 – philipxy

回答

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_idf_nod_no类(对于航班号和日期)类'。 (请注意,常规情况下,一个人只能一次飞行一班,如果 <>班'那么他们必须在相同的日期使用相同的航班号飞行多次, )

Q1 - Q2只是SELECT class <> class' Q1。因此,第三季度持有乘坐不同班级,并且在同一日期具有相同航班号的乘客的ID。为了对您的总体查询做出合理的解释,“这些班级中每个班级的成田飞机乘客至少一次”,这些人是不相关的。

但无论如何,既然{f_no,f_date}是飞行的CK(候选键),只有一个飞行对于给定的航班号和日期,所以没有乘客已经飞到同一航班号&日期不止一次。所以Q3无论如何都是空的。

形成从英语描述一个关系代数查询

总是表征关系 - 给定的一个或一个查询(子)的表达式的值 - 通过一个语句模板 - - 谓语按属性--parameterized。的关系认为,使之成为一个statement-- 命题凹口 - 是的情况真元组。

您必须被赋予每个基本关系断言:

-- (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_from = '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-r。的RENAME a\a' r谓词为predicate-of-r与(的某些事件)a通过a'取代。

进行查询,找到一些谓词等同于您所需的谓词,然后通过相应的关系式更换其部件。见this

约束&查询

我们必须知道,以查询谓词。约束条件(包括的FD,CKS,和的PK FKS)是可能出现的各种情况/状态的真理,在谓词表示。当查询查询的谓词是否只能用基谓词表达时,我们只需要知道约束,因为这些约束就成立了。例如,给乘客&飞行,但没有约束我们不能为“乘客已经从成田机场航班占领班”查询

p_id took f_no on f_date in class from f_orig to 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 

这没有告诉我们什么班级在什么航班上使用过。但是如果{f_no,f_date}在Flight中是唯一的,{f_no,f_date}是Flight的CK,那么这两个谓词表示相同的事物(即对于每个元组&情况都具有相同的真值)。

另一方面,我们不需要需要告知{f_no,f_date}是Passenger to Flight的FK。因为我们可以使用基地表达查询。当这是如此的约束是不需要的。该FK说,如果一些乘客在一些班级采取了f_nof_date那么我们就知道,以及给我们约束f_no立马就f_date一些产地到某个目的地的人,即乘客{f_no ,f_date}是一个航班{f_no,f_date}。哪些与CK约束形成FK约束。但是无论FK是否拥有查询都会返回满足其谓词的元组。