2017-04-09 8 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] 

質問は尋ねる:

は、乗客が成田からの便に占領されているクラスを考えてみましょう。 関係代数を書く: がこれらのクラスの成田から少なくとも1回飛行している乗客の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は人の乗客のすべてのIDを私が表示されます:私はこれまでのところで何をしたか

異なるクラスで2回以上旅行した。

この時点からさらに助けてもらえる人はいますか?

+0

テキストとして必要な文字を取得するためのGoogleの「Unicodeリレーショナルプロジェクション」など。阿蘇「ユニコードの数学記号」 – philipxy

+0

Q1の式は意味をなさない。 JOINの右のオペランドには、名前の変更が起こっている関係は記述されていません。また、多項式の代数変数もありますので、参考にしてください。 (これまでは、あなたが使っていた演算子だけを知っていました)PS [this](http://stackoverflow.com/a/41800639/3404097) – philipxy

+0

あなたのQ3のコメントは、 "異なるクラス[es]後でQ3が「別のクラスで2回以上旅をした乗客」と言っていますが、これはどちらかというと明確ではありません。実際にどのタプルを記述するかを編集してください。あなたのQ3コードがそれらのIDを与えると思うのはなぜですか?PS私は可能な限りあなたの言語と書式を編集しました。あなたのコードのテキスト版。 – philipxy

答えて

1

これは私の知る限りです。

あなたが実際に計算Q3は同じ日に同じフライト番号に複数のクラスで旅の乗客を保持しています。さらに、制約によると、はそのような乗客ではないです。あなたのコードのQ1による

は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_IDに(そのフライト番号と日付の)クラス d_no f_no を取り、:なぜここにありますクラス '。 (普通の意味では、一度に1つのクラスでのみ旅行することができる人で、クラス <>クラス 'の場合、同じ日付の同じフライト番号の複数の旅行が、 )。

Q1 - Q2は、ちょうどSELECT class <> class' Q1です。 Q3は異なるクラスの旅行者のIDを保持します同じ日付の同じフライト番号です。 「成田から各クラスに少なくとも1回飛行している乗客」という質問を合理的に解釈するには、その人は関係がありません。

しかし、{f_no、f_date}はFlightのCK(候補キー)なので、特定のフライト番号と日付のフライトは1つしかないため、同じフライト番号&を複数回飛行することはできません。とにかく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_from = '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であり、(ある出現の)aa'で置き換えられています。

クエリを実行するには、目的の述語に相当する述語を見つけ、その部分を対応する関係式で置き換えます。 thisを参照してください。

制約&

を照会私たちは、照会するために、述語を知っている必要があります。制約(FDs、CKs、PKs、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}が{f_no、f_date}がFlightのCKであることが暗示している{f_no、f_date}がFlightで一意であるならば、2つの述語は同じことを意味します(つまり、すべてのタプルに対して同じ真偽値を持ちます)。

{f_no、f_date}は、旅客から飛行機までのFKであることを伝える必要があります。ベースを使用してクエリを表現できるからです。そうであれば、制約は必要ない。FKは、一部の乗客は、いくつかのクラスにf_date f_no を取った場合、我々は f_no は、いくつかの目的地へのいくつかの起源からf_dateに飛んだ、f_no {旅客、すなわちことだけでなく、私たちに制約を与えた人を知っていると言います、f_date}はフライト{f_no、f_date}です。 CK制約でFK制約が形成されます。しかしFKがを保持しているかどうかにかかわらず、クエリはその述語を満たすタプルを返します。

関連する問題